2017-07-14 4 views
0

The in Abfrage`` Exists`and IN` geben zwei unterschiedliche Ergebnisse in MySQL

SELECT * FROM commodity 
WHERE id IN (SELECT cid FROM specifications s WHERE s.id<600); 

Die EXISTS Abfrage

SELECT * FROM commodity 
WHERE exists(SELECT c.* 
       FROM specifications s,commodity c 
       WHERE s.id < 600 and c.id = s.cid); 

Warum ich zwei separate immer bin Ergebnisse mit den oben genannten zwei Abfragen. Was mache ich falsch?

+0

Sie sind sehr unterschiedlich. IN überprüft, ob ein bestimmter Wert in einer Abfrage vorhanden ist, während exist nur prüft, ob ein Datensatz existiert. Verwenden Sie das für Ihren Zweck geeignete. Die zweite Abfrage wird nicht so schnell wie die erste ausgeführt. –

+0

Eine gerechtere Frage könnte sein: "Warum stellst du dir vor, dass sie gleich sind?" !?!? – Strawberry

Antwort

0

Sie brauchen nicht die JOIN Betrieb in der Unterabfrage des EXISTS Betreiber:

SELECT * FROM commodity c 
WHERE exists(SELECT c.* 
       FROM specifications s 
       WHERE s.id < 600 and c.id = s.cid); 

Die beiden Abfragen nun gleichwertig sind vorgesehen, dass id ein Feld nicht NULL ist.

+1

'SELECT c. *' ?? –

+0

@TimBiegeleisen Ich glaube nicht, dass es irgendeinen Unterschied macht, wenn man 'SELECT 1' oder' SELECT c. * 'Oder' SELECT c.id' im Suquery des 'EXIST'-Operators verwendet. –

+0

noch eine Frage, wenn ich ausführe: zeigen Sie Profile, Abfrage-ID zu sehen, warum einige SQ L verschwinden und andere Abfrage-ID ändert ihre Abfrage-ID? –

0

Sie verknüpfen die äußere Commodity-Tabelle NICHT in der inneren Abfrage. Es sollte so sein.

SELECT * FROM commodity c 
WHERE exists(SELECT s.* 
       FROM specifications s 
       WHERE s.id < 600 and c.id = s.cid); 
Verwandte Themen