Я пытаюсь разными способами обновить одну таблицу с условием.
Однако оба способа завершились неудачно и возвращают ошибку
более одной строки, возвращенной подзапросом, используемым в качестве выраженияСостояние SQL: 21000.
Мой код:
UPDATE "B_S1"."TC_history" AS TC
SET "CC_RESULT" = CASE
WHEN TT.C0 = 'b' THEN 'NEVER_CC'
ELSE NULL
END
FROM
(SELECT TR."CC_RESULT" AS C0
FROM
(SELECT *
FROM "B_TRACE"."P_TC_DATA" DAT
WHERE DAT."STATE_ID" IN ('7','8','9')) AS DATS,
"B_CCN"."CCN_CONSENT_RECORD" AS SUBID,
"B_TRACE"."P_TC_RECORD" AS TR,
"B_S1"."TC_history" AS TC
WHERE (SUBID."SUBJECT_C_ID" IS NOT NULL)
AND TR."P_SERIAL_ID"=SUBID."SUBJECT_ID"
AND SUBID."SUBJECT_ID"=DATS."P_SERIAL_ID"
AND TR."P_SERIAL_ID"=DATS."P_SERIAL_ID"
AND TC."SUBJECT_C_ID"=SUBID."SUBJECT_C_ID") AS TT
WHERE (SELECT "SUBJECT_C_ID" FROM "B_S1"."TC_history")= (SELECT TC."SUBJECT_C_ID"
FROM
(SELECT * FROM "B_TRACE"."P_TC_DATA" DAT WHERE DAT."STATE_ID" IN ('7','8','9')) AS DATS,
"B_CCN"."CCN_CONSENT_RECORD" AS SUBID,
"B_TRACE"."P_TC_RECORD" AS TR,
"B_S1"."TC_history" AS TC
WHERE (SUBID."SUBJECT_C_ID" IS NOT NULL)
AND TR."P_SERIAL_ID"=SUBID."SUBJECT_ID"
AND SUBID."SUBJECT_ID"=DATS."P_SERIAL_ID"
AND TR."P_SERIAL_ID"=DATS."P_SERIAL_ID"
AND TC."SUBJECT_C_ID"=SUBID."SUBJECT_C_ID")
Попробуйте скоррелированный путь
UPDATE
( SELECT *
FROM
(SELECT * FROM "B_TRACE"."P_TC_DATA" DAT WHERE DAT."STATE_ID" IN ('7','8','9')) AS DATS,
"B_CCN"."CCN_CONSENT_RECORD" AS SUBID,
"B_TRACE"."P_TC_RECORD" AS TR,
"B_S1"."TC_history" AS TCH
WHERE (SUBID."SUBJECT_C_ID" IS NOT NULL)
AND TR."P_SERIAL_ID"=SUBID."SUBJECT_ID"
AND SUBID."SUBJECT_ID"=DATS."P_SERIAL_ID"
AND TR."P_SERIAL_ID"=DATS."P_SERIAL_ID"
AND TCH."SUBJECT_C_ID"=SUBID."SUBJECT_C_ID"
) AS TT
SET TCH."CC_RESULT0"=CASE
WHEN TT."CC_RESULT"='b' THEN 'NEVER_CC'
ELSE NULL END;
Работает только при вставке всех столбцов вместе
INSERT INTO "B_S1".TC_history("SUBJECT_C_ID","CC_RESULT","NO_CC_RESULT",
"CC_TIME","BB_TIME_CC","BB_TIME_CCN","SITE_NAME","CC_NOTE","USER_NAME","IFTAXI","BB_TIME_TAXI","BB_LOCATION_TAXI","ESTABLISHED_TIME")
SELECT "SUBJECT_C_ID",
CASE WHEN TR."CC_RESULT"='b' THEN 'NEVER_CC'
ELSE NULL END,
CASE WHEN TR."CC_RESULT"='b' THEN 'DEAD'
ELSE NULL END,
"CC_TIME","BB_TIME_CC","BB_TIME_CCN","SITE_NAME",TR."CC_NOTE","USER_NAME",
CASE WHEN TR."BB_LOCATION_TAXI" IS NULL THEN FALSE
ELSE TRUE END,
"BB_TIME_TAXI","BB_LOCATION_TAXI","CC_TIME"
FROM (SELECT * FROM "B_TRACE"."P_TC_DATA" DAT WHERE DAT."STATE_ID" IN ('7','8','9')) AS DATS,
"B_CCN"."CCN_CONSENT_RECORD" AS SUBID,
"B_TRACE"."P_TC_RECORD" AS TR,
"B_SYSTEM"."SYSTEM_SITE" AS SI,
"B_SYSTEM"."SYSTEM_USER" AS SU
WHERE (SUBID."SUBJECT_C_ID" IS NOT NULL)
AND TR."P_SERIAL_ID"=SUBID."SUBJECT_ID"
AND SUBID."SUBJECT_ID"=DATS."P_SERIAL_ID"
AND TR."P_SERIAL_ID"=DATS."P_SERIAL_ID"
AND TR."SITE_NID"=SI."SITE_ID"
AND TR."USER_ID"=SU."USER_ID"
Можно ли обновить эти столбцы с таким условием?
Я не хочу создавать фактическую временную таблицу для подзапроса.
Создает временную таблицутаблица единственный способ решить эту проблему?