2017-06-30 1 views
0

ich folgende Abfrage haben:SELECT IN mit leeren Unterabfrage gibt seltsame Ergebnis

SELECT * FROM `table1` WHERE `id` IN 
     (
      SELECT `table1_id` FROM `table2` WHERE `id` in 
      (
       SELECT `table2_id` FROM `table3` WHERE `customer_id` = 57 
      ) 
     ) 

Es 10 Zeilen zurückgibt (von 50)
aber die Abfrage

SELECT `table1_id` FROM `table2` WHERE `id` in 
    (
     SELECT `table2_id` FROM `table3` WHERE `customer_id` = 57 
    ) 

0 zurück Reihen (welches ist richtig).
Also, wie kommt es, dass meine erste Abfrage mehrere Zeilen zurückgibt, während es 0 zurückgeben soll (wie die Unterabfrage).

Wenn ich eine customer_id verwende, die Zeilen bei der zweiten Abfrage zurückgeben soll, geht alles wie es sein soll.

Also meine Frage ist, warum tun:
Warum gibt die Abfrage Zeilen zurück, während die Unterabfrage nicht?

+0

Könnten Sie nicht beitreten zu vermeiden sein, nur um 'table2',' table3' und Umsetzung der 'customer_id' in eine WHERE 'anstatt mehrere Unterabfragen zu verschachteln? – Santi

+0

@Abhi Dies ist keine korrelierte Unterabfrage. – Barmar

+0

Wenn das wirklich passiert, klingt es wie ein Fehler. Können Sie einige Beispieldaten bereitstellen, die das demonstrieren? – Barmar

Antwort

1

Dies sollte die gleiche Abfrage in Klausel

Check für Resul

SELECT DISTINCT `table1`.* 
    FROM `table1` 
    INNER JOIN `table2` ON `table1`.`id` = `table2`.`table1_id` 
    INNER JOIN `table3` ON `table2`.`id` = `table3`.`table2_id` 
    and `table3`.`customer_id` = 57 
+0

Ändern Sie es in 'SELECT DISTINCT table1. *'. Andernfalls werden alle Spalten aus den anderen beiden Tabellen zurückgegeben, und bei mehreren Übereinstimmungen wird dieselbe Zeile mehrmals zurückgegeben. – Barmar

+0

@Barmar Danke .. Antwort aktualisiert mit Ihrem Vorschlag .. – scaisEdge

Verwandte Themen