2010-07-07 2 views
6

Ich habe drei Tabellen, 'A', 'B' und 'C'. Ich habe eine Abfrage auf 'A' und 'B', aber ich möchte ein Feld hinzufügen, das mir sagt, ob es einen oder mehrere gibt (mir egal, wie viele) 'C', die auf 'A' codiert sind.Eine bessere Möglichkeit, '1' zurückzugeben, wenn ein linker Join Zeilen zurückgibt?

Hier ist, was ich habe:

SELECT A.A_id, A.col_2, col_3, B.col_2, A.col_4 
      count(C.id) as C_count 
FROM  A 
JOIN  B ON (A.B_id = B.B_id) 
LEFT JOIN C ON (A.A_id = C.A_id) 
WHERE  A.A_id = ? 
GROUP BY A.A_id, A.col_2, col_3, B.col_2, A.col_4 
ORDER BY CASE WHEN A.col_2 = ? 
       THEN 0 
       ELSE 1 
      END, col_3; 

Es scheint ein wenig ineffizient, sowohl weil ich all diese Felder in den GROUP BY und auch zur Liste, weil ich zu zählen bin, wo alles, was ich wirklich will, ob es mindestens eine Übereinstimmung oder nicht. Kann das verbessert werden?

+1

Nur weil Sie eine Menge von Spaltennamen geben hatten nicht eine Abfrage ineffizient machen;) In diesem Fall aber sind Sie richtig. Das Sortieren und Tabellieren der Zählung ist kostspielig, aber möglicherweise noch kostspieliger ist es, dass die DB ALLE Zeilen in Tabelle C durchlaufen muss, um diese Zählung zu erhalten. Sobald die EXISTS-Lösung die erste übereinstimmende Zeile findet, kann sie aufhören zu suchen. –

+0

Gute Erklärung, @Tom. –

Antwort

13

Verwendung Exists mit einer Unterabfrage statt ...

Select A.A_id, A.col_2, col_3, 
    B.col_2, A.col_4, 
    Case When Exists (Select * From C 
         Where A_id = A.A_id) 
     Then 1 Else 0 End As C_Exists 
From A Join B 
    On (A.B_id = B.B_id) 
Where A.A_id = ?  
Order By Case When A.col_2 = ? 
      Then 0 Else 1 End, col_3; 
+0

+1 für existiert :-) – corsiKa

+0

Ausgezeichnet. EXPLAIN PLAN sagt, es ist auch besser. 3 Minuten bis ich es annehmen kann. –

+1

@Paul Tomblin: Das liegt daran, dass EXISTS den Wert true zurückgibt, sobald die erste erfolgreiche Übereinstimmung mit den Kriterien gefunden wurde - EXISTS muss nicht alle übereinstimmenden Kriterien überprüfen. –

Verwandte Themen