2012-04-05 7 views
1

Grundsätzlich möchte ich alle Zeilen aus der Tabelle Kunden, die nicht in der Tabelle brochure_requests angezeigt werden.SQL-Abfrage SELECT FROM 2 Tabellen - Gleich gibt korrekte Ergebnisse zurück, aber muss nicht gleich

SELECT *  
    FROM customers JOIN brochure_requests 
    WHERE brochure_requests.first_name != customers.customer_first_name 
    AND brochure_requests.last_name != customers.customer_last_name 

Die Abfrage funktioniert, wenn die Parameter =, aber sobald ich laufen ein! = Abfrage, das Programm (HeidiSQL) hängt auf unbestimmte Zeit oder bis ich es aufheben.

Antwort

4

Verwendung NOT EXISTS, z.B.

SELECT *  
FROM customers 
WHERE NOT EXISTS (
    SELECT 1 
    FROM brochure_requests 
    WHERE brochure_requests.first_name = customers.customer_first_name 
    AND brochure_requests.last_name = customers.customer_last_name) 

Ich würde auch vorschlagen, einen Index für die brochure_requests.first_name und brochure_requests.last_name Felder für eine verbesserte Leistung hinzufügen.

+0

Danke - das ist genau das, was ich wollte! – angelsdontkill

3
SELECT 
    * 
FROM 
    customers 
    LEFT JOIN brochure_requests 
     ON brochure_requests.first_name = customers.customer_first_name 
     AND brochure_requests.last_name = customers.customer_last_name 

WHERE 
    brochure_requests.first_name IS NULL 

Bedenken Sie auch Ihre Datenbank Normalisierung von CustomerID zu brochure_requests als Fremdschlüssel statt Duplizierung der Vor- und Nachnamen hinzufügen.

+0

+1 Das Hinzufügen eines CustomerID-Feldes wäre sogar besser als das Indizieren der Namensfelder. –

+0

Danke - das ist nicht genau das, was ich gesucht habe, aber es ist trotzdem hilfreich. – angelsdontkill

+0

Aus Neugier, auf welche Art und Weise fällt es zu kurz? Der Wechsel zu 'SELECT customers. * ...' sollte identische Ergebnisse zur akzeptierten Antwort ergeben. – KyleNZ

5

Haben Sie keine Kunden-ID in der Tabelle brochure_requests?

Wenn Sie das tun, können Sie etwas tun:

select * from customers 
where customerId not in (select customerId from brochure_requests) 
+0

Nein, die Tabellen sind überhaupt nicht verwandt, ärgerlich :(Sie sind völlig unabhängig voneinander, aber enthalten viele der gleichen Daten. Danke, obwohl – angelsdontkill

+0

so ändern Sie die Kundennummer auf den Kundennamen. Sie erhalten das gleiche Ergebnis – Diego

+0

Wenn die Daten unabhängig voneinander eingegeben werden, können Situationen auftreten, in denen der Kunde John Smith-Jones eine Broschürenanforderung als John Smith Jones hat und in der Ergebnismenge falsch angezeigt wird – KyleNZ