2017-03-02 1 views
0

Grundsätzlich habe ich 2 Tabellen mit der gleichen Struktur (Accounts und New_accounts). New_accounts hat mehr Einträge als Accounts, also muss ich nur diejenigen auswählen, die nicht in Accounts existieren.SQL erhält nur unterschiedliche Einträge zwischen 2 Tabellen basierend auf 2 Schlüsselparametern

Leider kann ich sie nur nach verschiedenen IDs sortieren. Das einzige, was zwischen den zwei Tabellen, auf die man sich verlassen kann, dasselbe ist, ist ein Kombinationspaar von dist_abbv und vip_id. Auf keinen Eintrag wird ein anderer das gleiche Paar haben. Der Eintrag A enthält also eine Kombination aus dist_abbv und vip_id, die nur für diesen Eintrag gilt. Auf diese Weise können Sie feststellen, ob es in beiden Tabellen vorhanden ist.

Tabellenfelder:

id | name | address | city | state | zip | phone | email | vip_id | dist_abbv 

Ich habe versucht, aber ich weiß, (via Anzahl der Zeilen), dass dieses nicht

SELECT new_accounts.* 
    FROM new_accounts 
    LEFT JOIN accounts 
    ON (accounts.vip_id = new_accounts.vip_id AND accounts.name = new_accounts.name) 
    WHERE (accounts.vip_id = new_accounts.vip_id AND accounts.name = new_accounts.name) IS NULL 
+0

Könnten Sie bitte einige Daten veröffentlicht, sobald es schwierig wird, über Szenario zu visualisieren? –

Antwort

0

die genauen Einträge Rückkehr Versuchen Sie WHERE Klausel

Wechsel
WHERE accounts.vip_id is NULL AND accounts.name is NULL 

Hoffe das hilft.

0

könnte sogar sagen, nur

WHERE accounts.id IS NULL 
0
SELECT new_accounts.* 
FROM new_accounts 
LEFT JOIN accounts 
ON (accounts.vip_id = new_accounts.vip_id AND accounts.name = new_accounts.name) 
HAVING accounts.id = NULL 

Seit seinem Eintritt in die Equate Bedingung tun, nur das Ergebnis filtern die HAVING wird holen das gewünschte Ergebnis mit

0

Dies ist eine „linke anti halb genannt wird Join ", und da ein negatives Join-Prädikat verwendet wird, variiert die Abfrageleistung stark in Abhängigkeit von Indizes, Ihrem Abfrageansatz und der verwendeten Datenbank-Engine.

Hier sind die Methoden, die ich kenne, unterschiedlich von denen jeder potentiell durchführen wird:

NICHT VORHANDEN

SELECT * 
FROM new_accounts 
WHERE NOT EXISTS (
    SELECT 1 
    FROM accounts 
    WHERE accounts.vip_id = new_accounts.vip_id AND accounts.name = new_accounts.name 
) 

SELECT new_accounts.* 
FROM new_accounts 
LEFT JOIN accounts 
    ON accounts.vip_id = new_accounts.vip_id 
    AND accounts.name = new_accounts.name 
WHERE accounts.vip_id IS NULL 

AUSSER IS NULL

Hinweis: Dies funktioniert nicht in MySQL. Diese Methode funktioniert auch nur, wenn new_accounts und accounts genau dasselbe Schema haben. Normalerweise würden Sie diese Operation tun, um eine einzelne Spalte des gleichen Typs Auswahl

SELECT * 
FROM new_accounts 
EXCEPT 
SELECT * 
FROM accounts 
+1

MySQL unterstützt nicht "AUSSER" AFAIK –

+1

Danke, du bist tot richtig. Ich habe das MySQL-Tag im ursprünglichen Post nicht gesehen. Ich habe die Antwort aktualisiert, um diese Einschränkung widerzuspiegeln. –

Verwandte Themen