mysql SELECT NICHT IN () - disjunkt gesetzt?

9

Ich habe ein Problem damit, dass eine Abfrage funktioniert, was meiner Meinung nach funktionieren sollte. Es ist in der Form

%Vor%

Aber mysql erstickt, wo "IN (" startet. Unterstützt mysql diese Syntax? Wenn nicht, wie kann ich über diese Ergebnisse gehen? Ich möchte verschiedene Tupel von (a, b, c) in Tabelle 1 finden, die don in Tabelle 2 nicht vorhanden.

    
user151841 11.02.2010, 17:57
quelle

6 Antworten

12

Sie sollten nicht verwenden:

%Vor%

Die Verwendung von NOT IN ist nicht die beste Methode, dies zu tun, selbst wenn Sie nur einen Schlüssel überprüfen. Der Grund dafür ist, dass das DBMS bei Verwendung von NOT EXISTS nur Indizes überprüfen muss, wenn Indizes für die benötigten Spalten vorhanden sind, wofür NOT IN die tatsächlichen Daten lesen und eine vollständige Ergebnismenge erstellen muss, die anschließend überprüft werden muss .

Wenn man einen LINKEN JOIN benutzt und dann nach NULL sucht, ist das auch eine schlechte Idee, es wird sehr langsam, wenn die Tabellen groß sind, da die Abfrage den gesamten Join machen muss, beide Tabellen vollständig lesen und anschließend viel davon wegwerfen . Wenn die Spalten NULL-Werte zulassen, die auf NULL überprüft werden, werden auch falsche Positive gemeldet.

    
wich 11.02.2010, 18:30
quelle
4

Ich hatte Schwierigkeiten, den richtigen Weg zur Ausführung dieser Abfrage zu finden, selbst mit den gegebenen Antworten; Dann fand ich die MySQL-Dokumentation, die ich brauchte:

SELECT DISTINCT store_type FROM stores WHERE NOT EXISTS (SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type);

Der Trick, um den ich mich kümmern musste, war der Verweis auf die Tabelle "Stores" aus der ersten Abfrage in der Unterabfrage. Hoffe, das hilft (oder hilft anderen, da dies ein alter Faden ist).

Von Ссылка

    
Coty 26.07.2012 22:24
quelle
0

SELECT DISTINCT t1. * VON t1 LINKER JOIN t2 ON (t1.a = t2.a UND t1.b = t2.b UND t1.c = t2.c) WO t2.a IS NULL

    
Charles 11.02.2010 18:20
quelle
0

Soweit ich weiß, kann NOT IN nur für jeweils ein Feld verwendet werden. Und das Feld muss zwischen "WHERE" und "NOT IN" angegeben werden.

(Bearbeiten :) Versuchen Sie es mit einem NOT EXISTS:

%Vor%

Darüber hinaus sollte ein innerer Join auf a, b und c gleich sein und alle Nicht-DISTINCT-Tupel enthalten, während ein LINKER JOIN mit einer WHERE IS NULL-Klausel Ihnen die DISTINCT-Tupel geben sollte, wie unten von Charles erwähnt / p>     

froadie 11.02.2010 18:00
quelle
0

Nun, ich werde meine eigene Frage beantworten, trotz all des großartigen Rates, den andere gegeben haben.

Hier ist die richtige Syntax für das, was ich versucht habe zu tun.

%Vor%

Ich kann zwar nicht für die Effizienz bürgen, aber die weiteren Fragen, die ich implizit stellte, waren "Wie drücke ich diesen Gedanken in SQL aus", nicht "Wie bekomme ich ein bestimmtes Ergebnis?". Ich weiß, das ist unfair gegenüber allen, die einen Stich gemacht haben, tut mir leid!

    
user151841 12.02.2010 03:09
quelle
-1

Sie müssen nach der WHERE-Klausel eine Spaltenliste hinzufügen und den Alias ​​entfernen.

Ich habe das mit einer ähnlichen Tabelle getestet und es funktioniert.

%Vor%

Verwenden Sie die mysql Welt db:

%Vor%     
Yada 11.02.2010 18:36
quelle

Tags und Links