SQL вставить в таблицу из выбора без дубликатов (нужно больше, чем DISTINCT) - PullRequest
15 голосов
/ 07 мая 2011

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

Если бы я выбирал по одной строке за раз, я мог бы сделать ЕСЛИ СУЩЕСТВУЕТ , но, поскольку он состоит из нескольких строк (иногда 10+), кажется, что я не могу это сделать.

Ответы [ 6 ]

26 голосов
/ 07 мая 2011
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)
2 голосов
/ 07 мая 2011

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

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

0 голосов
/ 18 апреля 2019

Вы можете использовать «ЗАМЕНИТЬ» вместо «Вставить».

0 голосов
/ 09 мая 2011

Есть несколько статей MSDN по этому поводу, но на данный момент эта является лучшей:

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

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

0 голосов
/ 07 мая 2011

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

    insert into <target_table> select col1 etc 
from <source_table> 
where <target_table>.keycol not in 
(select source_table.keycol from source_table)
0 голосов
/ 07 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...