2011-05-06 11 views
15

Wybieram wiele wierszy i wstawiam je do innej tabeli. Chcę się upewnić, że nie istnieje on już w tabeli, do której wstawiam wiele wierszy. DISTINCT działa, gdy w zaznaczeniu występują zduplikowane wiersze, ale nie podczas porównywania ich z danymi już znajdującymi się w tabeli, do których wstawiono.sql wstawić do tabeli z wybierz bez duplikatów (potrzebujesz więcej niż DISTINCT)

Jeśli wybrałem jeden wiersz na raz, mógłbym wykonać IF EXIST, ale ponieważ jest to wiele wierszy (czasami 10+), nie wydaje mi się, żebym mógł to zrobić.

+1

Podaj zapytanie, którego chcesz użyć. A baza danych też by pomogła. –

+1

Jeśli twój DBMS obsługuje instrukcję MERGE, która może być rozwiązaniem –

Odpowiedz

-1

Istnieje kilka artykułów MSDN tam na ten temat, ale zdecydowanie ten jest najlepszy:

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

Zrobili to naprawdę łatwe do wdrożenia i mój problem jest już rozwiązany. Również GUI jest brzydki, ale w rzeczywistości można ustawić minut interwały bez użycia wiersza polecenia w systemie Windows 2003.

-1

Chcesz uzyskać wszystkie unikalne wiersze z tabeli źródłowej, które nie istnieją jeszcze w tabeli docelowej?

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

Zakładając masz klucz podstawowy, który można oprzeć na wyjątkowość ... inaczej, trzeba sprawdzić każdą kolumnę do wyjątkowości.

-1

pseudo kod do czego może działać

insert into <target_table> select col1 etc 
from <source_table> 
where <target_table>.keycol not in 
(select source_table.keycol from source_table) 
20
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) 

Jeżeli odrębne powinny być tylko w niektórych kolumnach (np col1, col2), ale trzeba włożyć całą kolumnę, prawdopodobnie będziesz potrzebować tabelę pochodzącą (SQL ANSI):

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) 
+0

Prawdopodobnie będzie najlepszą odpowiedzią – vol7ron

2

Jeśli już mieć unikatowy indeks na cokolwiek pola muszą być unikatowe w tabeli docelowej, można po prostu użyć INSERT IGNORE (oto official documentation - odpowiedni bit jest pod koniec), a MySQL wyrzuci dla ciebie duplikaty.

Mam nadzieję, że to pomoże!

+0

Kiedy próbowałem zrobić "INSERT ... SELECT DISTINCT" w MySQL, otrzymałem komunikat "Unknown column" DISTINCT "in" Lista pól'". Jednak "INSERT IGNORE" zakończyło się sukcesem, gdyby było trochę wolniej niż "INSERT ... SELECT DISTINCT". – Mikkel

Powiązane problemy