【发布时间】:2013-03-26 15:28:27
【问题描述】:
我正在创建几个表并将它们中的数据合并到一个表中。这些表具有相似的 col1 和 col2 列,但这些列中的值可以不同,例如。 tab1 的第 1 行上的 col1 可能有“0”,而 tab2 中的 col1 可能在 col1“1”的同一行上。只有在这种情况下,我才需要更新第 1 行 col1 中 tab1 的值。请看以下示例:
BEFORE MERGING
tab1:
id col1 col2
1 0 0
2 0 1
3 0 0
AFTER MERGING WITH tab2
tab2: tab1:
id col1 col2 id col1 col2
1 1 0 ---> 1 1 0
2 0 0 2 0 1
3 0 0 3 0 0
为此,我使用以下查询:
merge into tab1 st
using (select id, col1, col2 from tab2) ss
ON (st.id=ss.id)
when matched then
update set st.col1 = ss.col1,
st.col2 = ss.col2
where ss.col1 != 0 or ss.col2 != 0
when not matched then
insert (st.id, st.col1, st.col2)
values (ss.id, ss.col1, ss.col2)
;
我只是在学习 sql,所以直到现在我才注意到这个查询不正确。它可以用来自tab2的“0”覆盖tab1中的“1”值。请帮我改进这个查询,我卡住了。
【问题讨论】:
-
您使用的是 MySQL 还是 Oracle?没想到 MySQL 支持 Merge...
-
这是一个简化版本,实际上我创建了 4 个表并尝试将它们与第一个表合并,仅更新 != 0 的单元格。我想知道“当 col1 不匹配时”这样的条件col2 然后插入 col2 值 col2" 可以在这里实现...
-
我用oracle,误导大家见谅