Sql 基于选择查询更新记录
我有一张表1:Sql 基于选择查询更新记录,sql,oracle,sql-update,sql-merge,Sql,Oracle,Sql Update,Sql Merge,我有一张表1: u_a_id d_c_s c_nm c_seq r_c_p 1 908 Test1 1 20 10 908 Test1 1 21 11 908 Test1 1 12 12759 908 Test1 1 31 12759 908 Test1 1 32 12861 878 Test2 1
u_a_id d_c_s c_nm c_seq r_c_p
1 908 Test1 1 20
10 908 Test1 1 21
11 908 Test1 1 12
12759 908 Test1 1 31
12759 908 Test1 1 32
12861 878 Test2 1 43
12861 878 Test2 1 44
我还有一张表2:
d_c_s c_nm c_seq n_min_d_c_s n_min_c_nm
908 Test1 1 12001 Test1, First
878 Test2 1 12002 Test2, First
我需要更新表1==>
表1.c_nm=表2.n_min_c_nm
表1.d_c_s=表2.n_min_d_c_s
要更新的条件是:
仅记录u_a_id、d_c_s、c_seq的计数大于1的情况-从表1中选择u_a_id、d_c_s、c_nm、c_seq、count*cnt,其中c_nm不在“VOID”中,按u a_id、d_c_s、c_nm、c_seq分组计数大于1;
表1.d_c_s=表2.d_c_s
表1.c_纳米=表2.c_纳米
表1.c_seq=表2.c_seq
使用r_c_p的最小值
输出如下所示:
u_a_id d_c_s c_nm c_seq r_c_p
1 908 Test1 1 20
10 908 Test1 1 21
11 908 Test1 1 12
12759 12001 Test1, First 1 31
12759 908 Test1 1 32
12861 12002 Test2, First 1 43
12861 878 Test2 1 44
创建更新/合并查询的最佳方法是什么
DBFIDDLE演示-
您可以使用MERGE语句进行以下操作:
MERGE INTO TABLE1 T1
USING (
SELECT
MIN(TI1.R_C_P) AS R_C_P,
TI1.U_A_ID,
TI1.D_C_S,
TI1.C_NM,
TI1.C_SEQ,
TI2.N_MIN_C_NM,
TI2.N_MIN_D_C_S
FROM
TABLE1 TI1
JOIN TABLE2 TI2
ON ( TI1.D_C_S = TI2.D_C_S
AND TI1.C_NM = TI2.C_NM
AND TI1.C_SEQ = TI2.C_SEQ
AND TI1.C_NM NOT IN (
'VOID',
'WRONG'
) )
GROUP BY
TI1.U_A_ID,
TI1.D_C_S,
TI1.C_NM,
TI1.C_SEQ,
TI2.N_MIN_C_NM,
TI2.N_MIN_D_C_S
HAVING
COUNT(1) > 1
)
T2 ON ( T1.C_SEQ = T2.C_SEQ
AND T1.R_C_P = T2.R_C_P )
WHEN MATCHED THEN
UPDATE
SET T1.C_NM = T2.N_MIN_C_NM,
T1.D_C_S = T2.N_MIN_D_C_S
WHERE
T1.D_C_S = T2.D_C_S
AND T1.C_NM = T2.C_NM
AND T1.U_A_ID = T2.U_A_ID -- ADDED THIS CONDITION
-- WHERE CONDITION IS USED AS IT CAN NOT BE USED INSIDE ON CLAUSE
-- TO AVOID ERROR : ORA-38104: Columns referenced in the ON Clause cannot be updated
干杯 如果我将第一行的R_C_p更改为43,则会给出错误的输出-是的,我试图在WHERE子句中放置一些唯一的列。现在我已经在它里面放了U_A_ID,这样它就可以识别正确的记录了。如果表1中有PK,则只使用WHERE子句中的该列。。请参阅更新的答案和更新的fiddler链接。这一行是T2.C_SEQ=T2.C_SEQ上的T2吗?正确吗?哦。。不,那是不对的。现在已更正。是否会因此导致任何问题?如果我将第一行的r_c_p更改为43,则输出错误-不清楚这是否是一个要求。看起来你找到了一个满足你需要的答案,所以我不打算重做了。
MERGE INTO TABLE1 T1
USING (
SELECT
MIN(TI1.R_C_P) AS R_C_P,
TI1.U_A_ID,
TI1.D_C_S,
TI1.C_NM,
TI1.C_SEQ,
TI2.N_MIN_C_NM,
TI2.N_MIN_D_C_S
FROM
TABLE1 TI1
JOIN TABLE2 TI2
ON ( TI1.D_C_S = TI2.D_C_S
AND TI1.C_NM = TI2.C_NM
AND TI1.C_SEQ = TI2.C_SEQ
AND TI1.C_NM NOT IN (
'VOID',
'WRONG'
) )
GROUP BY
TI1.U_A_ID,
TI1.D_C_S,
TI1.C_NM,
TI1.C_SEQ,
TI2.N_MIN_C_NM,
TI2.N_MIN_D_C_S
HAVING
COUNT(1) > 1
)
T2 ON ( T1.C_SEQ = T2.C_SEQ
AND T1.R_C_P = T2.R_C_P )
WHEN MATCHED THEN
UPDATE
SET T1.C_NM = T2.N_MIN_C_NM,
T1.D_C_S = T2.N_MIN_D_C_S
WHERE
T1.D_C_S = T2.D_C_S
AND T1.C_NM = T2.C_NM
AND T1.U_A_ID = T2.U_A_ID -- ADDED THIS CONDITION
-- WHERE CONDITION IS USED AS IT CAN NOT BE USED INSIDE ON CLAUSE
-- TO AVOID ERROR : ORA-38104: Columns referenced in the ON Clause cannot be updated