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?
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. –
Gute Erklärung, @Tom. –