2016-08-16 6 views
-3

Hier ist meine Abfrage, aber das Ergebnis ist falsch.SQL IN() funktioniert nicht richtig

SELECT winner 
FROM nobel 
WHERE 
    subject = 'Economics' AND 
    yr IN (
    SELECT min('yr') 
    FROM nobel 
    WHERE subject = 'Economics' 
); 
+1

Zeigen Sie uns ** Beispieldaten **, zeigen uns, was in der Tat wird ausgewählt, und erklären, warum * * das ist „falsch“ ..... –

Antwort

3

Ich glaube, das Problem die Anführungszeichen ist die yr innerhalb der MIN() Einwickeln, die das Optimierungsprogramm Adresse dieses als String macht, die sie ausgewertet werden verursacht als MIN(constant_value) die immer constant_value ist.

Versuchen:

SELECT winner FROM nobel 
WHERE subject='Economics' 
     AND yr IN (SELECT min(yr) FROM nobel WHERE subject='Economics'); 
+0

ja, vielen Dank! Ich mache einen kleinen Fehler ... Danke für deine Antwort! – porkie

1

Das Problem ist die einfachen Anführungszeichen um yr als @sagi weist darauf hin. Ich möchte nur darauf hinweisen, dass eine korrelierte Klausel für eine solche Abfrage typischere ist zusammen mit =:

SELECT n.winner 
FROM nobel n 
WHERE n.subject = 'Economics' AND 
     n.yr = (SELECT min(yr) FROM nobel n2 WHERE n2.subject = n.subject); 

Die Verwendung von = gegen in hier könnte scheinen, wie ein kleiner Punkt zu Ihnen. = besagt jedoch, dass höchstens eine Zeile zurückgegeben wird und in schlägt vor, dass mehrere Zeilen zurückgegeben werden können. Dies ist ein wichtiger Unterschied für den SQL-Optimierer.

+0

ja, vielen Dank! Ich mache einen kleinen Fehler ... danke für deine Antwort! Und ich versuche '=' anstelle von 'IN' zu verwenden und das Ergebnis ist auch korrekt, aber es zeigt zwei Zeilen, weil es zwei Gewinner gibt. Vielleicht hast du gesagt "= sagt, dass höchstens eine Zeile zurückgegeben wird "have etwas falsch oder ich missverstehe ?? – porkie

0
SELECT winner 
FROM nobel 
WHERE 
    subject = 'Economics' AND 
    yr IN (
     SELECT min(yr) # ---> just remove quotes in your query, it will work 
     FROM nobel 
     WHERE subject = 'Economics' 
    );