我正在选择多行并将它们插入另一个表中。我想确保在我插入多行的表中不存在它。 DISTINCT 在select中有重复行时有效,但在将其与插入的表中已有的数据进行比较时无效。
如果我一次选择一行,我可以执行 IF EXIST ,但由于它的多行(有时是10+),我似乎无法做到这一点。
答案 0 :(得分:26)
INSERT INTO target_table (col1, col2, col3)
SELECT DISTINCT st.col1, st.col2, st.col3
FROM source_table st
WHERE NOT EXISTS (SELECT 1
FROM target_table t2
WHERE t2.col1 = st.col1
AND t2.col2 = st.col2
AND t2.col3 = st.col3)
如果distinct应该只在某些列上(例如col1,col2),但是你需要插入所有列,你可能需要一些派生表(ANSI SQL):
INSERT INTO target_table (col1, col2, col3)
SELECT st.col1, st.col2, st.col3
FROM (
SELECT col1,
col2,
col3,
row_number() over (partition by col1, col2 order by col1, col2) as rn
FROM source_table
) st
WHERE st.rn = 1
AND NOT EXISTS (SELECT 1
FROM target_table t2
WHERE t2.col1 = st.col1
AND t2.col2 = st.col2)
答案 1 :(得分:2)
如果您已经在目标表中需要唯一的任何字段上有唯一索引,则可以使用INSERT IGNORE(这里是official documentation - 相关位朝向结尾),并且有MySQL丢弃重复项。
希望这有帮助!
答案 2 :(得分:-1)
那么您是否希望从源表中检索目标表中尚不存在的所有唯一行?
SELECT DISTINCT(*) FROM source
WHERE primaryKey NOT IN (SELECT primaryKey FROM target)
假设你有一个主键,你可以将唯一性作为基础......否则,你必须检查每一列的唯一性。
答案 3 :(得分:-1)
可能有效的伪代码
insert into <target_table> select col1 etc
from <source_table>
where <target_table>.keycol not in
(select source_table.keycol from source_table)
答案 4 :(得分:-1)
您可以使用“ REPLACE”代替“ Insert”。
答案 5 :(得分:-2)
有一些关于此的MSDN文章,但到目前为止,这是最好的:
http://msdn.microsoft.com/en-us/library/ms162773.aspx
他们让它变得非常容易实现,我的问题现在已经解决了。 GUI也很难看,但实际上你可以在不使用Windows 2003命令行的情况下设置分钟间隔。