Angenommen, wir haben 4 Tabellen A, B, C, D in einige nicht näher angegebenen relationalen SQL-Datenbank. A Referenzen B, auch C und D. Referenzen bedeutet, dass A die Spalte A.refX_id = X.id hat, X ist A, B und C (gemeinsamer Fremdschlüssel 1: N).SELECT ... WHERE IN vs JOIN
Was ich will, ist Abfrage der Tabelle A mit der Bedingung basierend auf Spalten aus allen untergeordneten Tabellen B, C und D. Meine Frage ist: Welche der folgenden Varianten ist im Allgemeinen besser? (. In Bezug auf Benutzerfreundlichkeit, Effizienz, Geschwindigkeit)
Variante 1:
SELECT DISTINCT A.* FROM A
JOIN B ON A.refB_id = B.id
JOIN C ON A.refC_id = C.id
JOIN D ON A.refD_id = D.id
WHERE <condition on B> AND <condition on C> AND <condition on D>;
Was ich mehr von einer Datenbank aus Sicht mag, sieht aber ein wenig zu Programm härter.
Variante 2:
SELECT id FROM B WHERE <condition on B>; # result store to array "BIds" on program side
SELECT id FROM C WHERE <condition on C>; # result store to array "CIds" on program side
SELECT id FROM D WHERE <condition on D>; # result store to array "DIds" on program side
SELECT A.* FROM A
WHERE refB_id IN (<B_ids>) AND refC_id IN (<C_ids>) AND refD_id IN (<D_ids>);
# <B_ids> menas expand whole array of ids, which can result in a very long query string
Ich dachte, dass Variante 2 completelly Schmutz und unbrauchbar mit potenziell großen Daten ist. Aber ich habe gehört, dass viele Frameworks es normalerweise benutzen, weil es relativ einfach ist. Ist es eine Art legaler Weg, solche Daten im allgemeinen Fall abzufragen, wenn ich weiß, dass der Inhalt der "IN" -Klausel von einem Ergebnis einer anderen Abfrage (n) genommen wird?
War gerade diese Frage suchen und fand diese Antwort: http://stackoverflow.com/questions/121631/inner-join-vs-wo? rq = 1 – CodeJockey