sql从select中插入到表中而没有重复项(需要更多然后是DISTINCT)

时间:2011-05-06 20:28:47

标签: sql insert duplicates

我正在选择多行并将它们插入另一个表中。我想确保在我插入多行的表中不存在它。   DISTINCT 在select中有重复行时有效,但在将其与插入的表中已有的数据进行比较时无效。

如果我一次选择一行,我可以执行 IF EXIST ,但由于它的多行(有时是10+),我似乎无法做到这一点。

6 个答案:

答案 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命令行的情况下设置分钟间隔。