Sql вставить в таблицу из выбора без дубликатов (нужно больше DISTINCT)

Я выбираю несколько строк и вставляю их в другую таблицу. Я хочу убедиться, что он еще не существует в таблице, в которую я вставляю несколько строк.   DISTINCT работает, когда в элементе есть повторяющиеся строки, но не при сравнении с данными, уже находящимися в таблице, в которую вы вставляете.

Если я выбрал одну строку за раз, я мог бы сделать IF EXIST, но поскольку ее несколько строк (иногда 10+), похоже, я не могу этого сделать.

Ответ 1

Здесь есть несколько статей MSDN, но, безусловно, это лучший вариант:

http://msdn.microsoft.com/en-us/library/ms162773.aspx

Они сделали его очень простым в реализации, и теперь моя проблема исправлена. Также графический интерфейс является уродливым, но на самом деле вы можете установить минутные интервалы без использования командной строки в Windows 2003.

Ответ 2

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)

Если отдельный должен быть только в определенных столбцах (например, 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)

Ответ 3

Если у вас уже есть уникальный индекс для любых полей, которые должны быть уникальными в таблице назначения, вы можете просто использовать INSERT IGNORE (здесь официальная документация - соответствующий бит ближе к концу), и MySQL отбросит дубликаты для вас.

Надеюсь, это поможет!

Ответ 4

Итак, вы хотите получить все уникальные строки из исходной таблицы, которые еще не существуют в целевой таблице?

SELECT DISTINCT(*) FROM source
WHERE primaryKey NOT IN (SELECT primaryKey FROM target)

Предположим, что у вас есть первичный ключ, на котором вы можете основывать уникальность... в противном случае вам нужно будет проверить каждый столбец на уникальность.

Ответ 5

псевдокод для того, что может работать

    insert into <target_table> select col1 etc 
from <source_table> 
where <target_table>.keycol not in 
(select source_table.keycol from source_table)

Ответ 6

В моем случае я использовал "ЗАМЕНА" вместо "Вставка".