2016-05-31 6 views
0

Ich habe diese Anfrage:0 = (Wählen Sie die Anzahl (h.id_h) aus Haus h, wobei h.id_h = lp.id_h UND h.id_none = '1') Bedeutung?

select lp.id_line 
from Line lp, 
    Enter eta 
WHERE lp.date_line <= sysdate 
    AND lp.status = 10 
    AND 0 = (select count(h.id_h) from House h where h.id_h = lp.id_h AND h.id_none = '1') 
    AND lp.et_code = eta.et_code 
    AND (eta.et_block <> '1' or eta.et_block is null) 
    and eta.par_code In ('DC46004'); 

Allerdings verstehe ich nicht, was das Teil:

AND 0 = (select count(h.id_h) from House h where h.id_h = lp.id_h AND h.id_none = '1') 

tut. Die Linie

select count(h.id_h) from House h where h.id_h = lp.id_h AND h.id_none = '1' 

kehrt 7 als Ergebnis. Bitte helfen ...

Antwort

1

Dies:

AND 0 = (select count(h.id_h) from House h 
    WHERE h.id_h = lp.id_h 
    AND h.id_none = '1') 

ist semantisch äquivalent zu:

AND NOT EXISTS (select * from House h 
WHERE h.id_h = lp.id_h 
AND h.id_none = '1') 

By the way, das eine korrelierte Unterabfrage ist, die für jede Zeile in Zeile einmal ausgeführt wird. Einige Optimierer werden es in s join konvertieren, aber wenn sie es nicht tun, wird es schlecht funktionieren.

Es wäre besser, diese Abfrage so zu konvertieren, dass nur (richtige) Joins verwendet werden.

0

Sie erhalten keine Ergebnisse, es sei denn, die innere Abfrage gibt Null zurück. Zum Beispiel gibt die folgende Abfrage den zweithöchsten Wert zurück, wenn Sie möchten, dass Sie für den dritthöchsten Wert auf 3 wechseln können, die folgende Abfrage wird Ihnen eine Idee geben.

SELECT a.sal 
FROM emp a 
WHERE 2 = (SELECT (COUNT(DISTINCT(sal))) FROM emp b WHERE a.sal <= b.sal) 

~ Temruzinn

+0

Nur eine Notiz, 'DISTINCT' ist keine Funktion! I.e. Du machst tatsächlich 'COUNT (DISTINCT sal)'. – jarlh

Verwandte Themen