Warum sollten Sie JOIN statt innere Abfragen verwenden?

7

Ich bin nicht bereit, mit JOIN zu arbeiten, wenn ich das gleiche Problem mit einer inneren Abfrage leicht lösen kann:

z.B.

SELECT COLUMN1, ( SELECT COLUMN1 FROM TABLE2 WHERE TABLE2.ID = TABLE1.TABLE2ID ) AS COLUMN2 FROM TABLE1;

Meine Frage ist, ist das eine schlechte Programmierpraxis? Ich finde es einfacher zu lesen und zu pflegen als im Gegensatz zu einem Join.

AKTUALISIEREN

Ich möchte hinzufügen, dass es hier ein tolles Feedback gibt, das im Wesentlichen darauf abzielt, wieder mit JOIN zu arbeiten. Ich bin immer weniger damit beschäftigt, TSQL direkt als Ergebnis von ORM-Lösungen zu verwenden (LINQ to SQL, NHibernate, etc.), aber wenn ich es tue, sind es Dinge wie korrelierte Unterabfragen, die einfacher linear zu tippen sind .

    
Keith Adler 24.02.2010, 17:38
quelle

8 Antworten

8
___ qstntxt ___

Ich bin nicht bereit, mit JOIN zu arbeiten, wenn ich das gleiche Problem mit einer inneren Abfrage leicht lösen kann:

z.B.

%code%

Meine Frage ist, ist das eine schlechte Programmierpraxis? Ich finde es einfacher zu lesen und zu pflegen als im Gegensatz zu einem Join.

AKTUALISIEREN

Ich möchte hinzufügen, dass es hier ein tolles Feedback gibt, das im Wesentlichen darauf abzielt, wieder mit JOIN zu arbeiten. Ich bin immer weniger damit beschäftigt, TSQL direkt als Ergebnis von ORM-Lösungen zu verwenden (LINQ to SQL, NHibernate, etc.), aber wenn ich es tue, sind es Dinge wie korrelierte Unterabfragen, die einfacher linear zu tippen sind .

    
___ answer2328143 ___

Wenn Sie mehr als eine Spalte aus der zweiten Tabelle benötigen, benötigen Sie zwei Unterabfragen. Dies würde normalerweise nicht so gut funktionieren wie ein Join.

    
___ qstnhdr ___ Warum sollten Sie JOIN statt innere Abfragen verwenden? ___ antwort2328136 ___

Ich persönlich finde das unglaublich schwer zu lesen. Es ist nicht die Struktur, die ein SQL-Entwickler erwartet. Wenn Sie JOIN verwenden, behalten Sie alle Tabellenquellen an einer Stelle, anstatt sie in der gesamten Abfrage zu verteilen.

Was passiert, wenn Sie drei oder vier Joins benötigen? All diese Elemente in die SELECT-Klausel zu integrieren, wird haarig.

    
___ answer2328234 ___

Dies entspricht nicht JOIN.

Wenn Sie in TABLE2 für jede Zeile in TABLE1 mehrere Zeilen haben, erhalten Sie sie nicht. Für jede Zeile in TABLE1 erhalten Sie eine Zeilenausgabe, sodass Sie aus TABLE2 nicht mehrere erhalten können.

Deshalb würde ich "JOIN" verwenden: um sicherzustellen, dass ich die Daten bekomme, die ich wollte ...

Nach deinem Update: Ich verwende selten Korrelation außer EXISTS ...

    
___ answer2328176 ___

Das ist bei IMO keine schlechte Programmierung, aber es ist ein bisschen hässlich. Es kann tatsächlich eine Leistungssteigerung in Situationen sein, in denen die Unterauswahl aus einer sehr großen Tabelle stammt, während Sie eine sehr kleine Ergebnismenge erwarten (Sie müssen Indizes und Plattform berücksichtigen, 2000 mit einem anderen Optimierer und alle ab 2005). Hier ist, wie ich es formatiere, um leichter zu lesen.

%Vor%

Bearbeiten: Dies setzt natürlich voraus, dass Ihr Subselect nur einen Wert zurückgibt, andernfalls könnte er Ihnen schlechte Ergebnisse zurückgeben. Siehe Antwort von gbn.

    
___ answer2328232 ___

es macht es viel einfacher, andere Arten von Joins zu verwenden (links outer, cross, usw.), weil die Syntax für diejenigen in Unterabfrage-Begriffen weniger als ideal für die Lesbarkeit ist

    
___ tag123sqlserver ___ Microsoft SQL Server ist ein relationales Datenbankverwaltungssystem (RDBMS). Verwenden Sie dieses Tag für alle SQL Server-Editionen, einschließlich Compact, Express, Azure, Fast-Track, APS (früher PDW) und Azure SQL DW. Verwenden Sie dieses Tag nicht für andere Arten von DBMS (MySQL, PostgreSQL, Oracle usw.). Verwenden Sie dieses Tag nicht für Probleme bei der Software- und mobilen Entwicklung, es sei denn, es steht in direktem Zusammenhang mit der Datenbank. ___ answer2328239 ___

Die von Ihnen verwendete Abfrage wurde oft als Ersatz für %code% für die Engines verwendet, bei denen diese fehlte (vor allem %code% vor %code% )

Dieser Ansatz hat einige schwerwiegende Nachteile:

  1. Es kann fehlschlagen, wenn %code% nicht %code%

  2. ist
  3. Einige Suchmaschinen können nichts anderes als %code% für diese Abfrage verwenden

  4. Wenn Sie mehr als eine Spalte auswählen müssen, müssen Sie die Unterabfrage mehrmals schreiben

Wenn Ihr Modul %code% unterstützt, verwenden Sie %code% .

In %code% gibt es jedoch Fälle, in denen eine Aggregatfunktion in einer Unterabfrage auf Auswahlebene effizienter sein kann als die in einer %code% mit einer %code% .

Sehen Sie diesen Artikel in meinem Blog für die Beispiele:

___ answer2329419 ___

Am Ende des Tages besteht das Ziel beim Schreiben von Code über die funktionalen Anforderungen hinaus darin, die Absicht Ihres Codes einem Leser klar zu machen. Wenn Sie ein JOIN verwenden, ist die Absicht offensichtlich. Wenn Sie eine Unterabfrage in der von Ihnen beschriebenen Weise verwenden, stellt sich die Frage, warum Sie es so gemacht haben. Was wollten Sie erreichen, was ein JOIN nicht erreicht hätte? Kurz gesagt, Sie verschwenden die Zeit des Lesers zu versuchen, festzustellen, ob der Autor ein Problem auf geniale Weise gelöst hat oder ob sie den Code nach einer harten Nacht des Trinkens geschrieben haben.

    
___ answer2328142 ___

Ein Join ist normalerweise schneller als eine korrelierte Unterabfrage, da es sich auf die Menge der Zeilen und nicht auf jeweils eine Zeile auswirkt. Ich würde diesen Code nie auf meinen Produktionsserver übertragen lassen.

Und ich finde eine Verbindung viel einfacher zu lesen und zu pflegen.

    
___
Jordan Parmer 24.02.2010, 17:40
quelle
6

Ein Join ist normalerweise schneller als eine korrelierte Unterabfrage, da es sich auf die Menge der Zeilen und nicht auf jeweils eine Zeile auswirkt. Ich würde diesen Code nie auf meinen Produktionsserver übertragen lassen.

Und ich finde eine Verbindung viel einfacher zu lesen und zu pflegen.

    
HLGEM 24.02.2010 17:41
quelle
6

Wenn Sie mehr als eine Spalte aus der zweiten Tabelle benötigen, benötigen Sie zwei Unterabfragen. Dies würde normalerweise nicht so gut funktionieren wie ein Join.

    
a'r 24.02.2010 17:41
quelle
4

Dies entspricht nicht JOIN.

Wenn Sie in TABLE2 für jede Zeile in TABLE1 mehrere Zeilen haben, erhalten Sie sie nicht. Für jede Zeile in TABLE1 erhalten Sie eine Zeilenausgabe, sodass Sie aus TABLE2 nicht mehrere erhalten können.

Deshalb würde ich "JOIN" verwenden: um sicherzustellen, dass ich die Daten bekomme, die ich wollte ...

Nach deinem Update: Ich verwende selten Korrelation außer EXISTS ...

    
gbn 24.02.2010 17:55
quelle
4

Die von Ihnen verwendete Abfrage wurde oft als Ersatz für LEFT JOIN für die Engines verwendet, bei denen diese fehlte (vor allem PostgreSQL vor 7.2 )

Dieser Ansatz hat einige schwerwiegende Nachteile:

  1. Es kann fehlschlagen, wenn TABLE2.ID nicht UNIQUE

  2. ist
  3. Einige Suchmaschinen können nichts anderes als NESTED LOOPS für diese Abfrage verwenden

  4. Wenn Sie mehr als eine Spalte auswählen müssen, müssen Sie die Unterabfrage mehrmals schreiben

Wenn Ihr Modul LEFT JOIN unterstützt, verwenden Sie LEFT JOIN .

In MySQL gibt es jedoch Fälle, in denen eine Aggregatfunktion in einer Unterabfrage auf Auswahlebene effizienter sein kann als die in einer LEFT JOIN mit einer GROUP BY .

Sehen Sie diesen Artikel in meinem Blog für die Beispiele:

Quassnoi 24.02.2010 17:55
quelle
1

Das ist bei IMO keine schlechte Programmierung, aber es ist ein bisschen hässlich. Es kann tatsächlich eine Leistungssteigerung in Situationen sein, in denen die Unterauswahl aus einer sehr großen Tabelle stammt, während Sie eine sehr kleine Ergebnismenge erwarten (Sie müssen Indizes und Plattform berücksichtigen, 2000 mit einem anderen Optimierer und alle ab 2005). Hier ist, wie ich es formatiere, um leichter zu lesen.

%Vor%

Bearbeiten: Dies setzt natürlich voraus, dass Ihr Subselect nur einen Wert zurückgibt, andernfalls könnte er Ihnen schlechte Ergebnisse zurückgeben. Siehe Antwort von gbn.

    
doug_w 24.02.2010 17:44
quelle
0

es macht es viel einfacher, andere Arten von Joins zu verwenden (links outer, cross, usw.), weil die Syntax für diejenigen in Unterabfrage-Begriffen weniger als ideal für die Lesbarkeit ist

    
Jason M 24.02.2010 17:54
quelle
0

Am Ende des Tages besteht das Ziel beim Schreiben von Code über die funktionalen Anforderungen hinaus darin, die Absicht Ihres Codes einem Leser klar zu machen. Wenn Sie ein JOIN verwenden, ist die Absicht offensichtlich. Wenn Sie eine Unterabfrage in der von Ihnen beschriebenen Weise verwenden, stellt sich die Frage, warum Sie es so gemacht haben. Was wollten Sie erreichen, was ein JOIN nicht erreicht hätte? Kurz gesagt, Sie verschwenden die Zeit des Lesers zu versuchen, festzustellen, ob der Autor ein Problem auf geniale Weise gelöst hat oder ob sie den Code nach einer harten Nacht des Trinkens geschrieben haben.

    
Thomas 24.02.2010 20:51
quelle

Tags und Links