Frage

Gibt es einen signifikanten Unterschied zwischen den folgenden?

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

und

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

Haben SO Benutzer eine Präferenz des einen über den anderen?

War es hilfreich?

Lösung

Es gibt keinen Unterschied, aber die Lesbarkeit der zweiten ist viel besser, wenn Sie eine große Multi-Join-Abfrage mit zusätzlichem, wo Klauseln für die Filterung.
Die Trennung der Join-Klauseln und die Filterklauseln ist eine gute Sache:)

Andere Tipps

Die frühere ANSI 89-Syntax, letztere ist ANSI 92.

Für , die spezifische Abfrage gibt es keinen Unterschied. Doch mit dem ehemaligen verlieren Sie die Möglichkeit, einen Filter aus einer Join-Bedingung in komplexen Abfragen zu trennen, und die Syntax angeben LEFT vs RECHTS vs INNER oft verwirrend, vor allem, wenn Sie hin und her zwischen dem verschiedenen db-Anbieter gehen. Ich mag die ältere Syntax nicht.

Es gibt keinen Unterschied zu der SQL-Abfrage-Engine.

Zur besseren Lesbarkeit, letztere ist viel einfacher zu lesen, wenn Sie Zeilenumbrüche und Einzüge verwenden.

Für INNER JOIN, spielt es keine Rolle, ob Sie „Filter“ setzen und „Joins“ in ON oder WHERE-Klausel, sollte die Abfrage-Optimierer entscheiden, was ohnehin zuerst zu tun (es wählt zuerst einen Filter zu tun, verbinden sie zu einem späteren oder vice versa

Für OUTER JOIN jedoch gibt es einen Unterschied, und manchmal youll wollen die Bedingung in der ON-Klausel setzen, manchmal in der WHERE. Putting eine Bedingung in der WHERE-Klausel für eine OUTER JOIN kann sie in eine innere drehen JOIN (weil, wie NULLs Arbeit)

Zum Beispiel, überprüfen Sie die Lesbarkeit zwischen den beiden folgenden Beispielen:

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c, order o, orderrow r, article a
WHERE o.customer_id = c.customer_id
AND r.order_id = o.order_id
AND a.article_id = r.article_id
AND o.orderdate >= '2003-01-01'
AND o.orderdate < '2004-01-01'
AND c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

vs

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c 
INNER JOIN order o
   ON  o.customer_id = c.customer_id
   AND o.orderdate >= '2003-01-01'
   AND o.orderdate < '2004-01-01'
INNER JOIN orderrow r
   ON  r.order_id = o.order_id
INNER JOIN article a 
   ON  a.article_id = r.article_id
WHERE  c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

Während Sie die meisten Aufgaben ausführen können, sowohl mit und in Ihrem Fall gibt es keinen Unterschied auch immer, werde ich immer die zweite jederzeit verwendet werden.

  1. Es ist der aktuelle Standard unterstützt
  2. Es hält schließt sich in der FROM-Klausel und Filter in der WHERE-Klausel
  3. Es macht komplexere LINKS, RECHTS, FULL OUTER schließt sich viel einfacher
  4. MSSQL Hilfe alle um diese Syntax basiert daher viel einfacher Hilfe zu Ihrem Problem Abfragen zu bekommen

Während kein Unterschied technisch ist, müssen Sie besonders vorsichtig sein, über das Tun der ersten Methode Joins verwenden. Wenn Sie es falsch durch Zufall bekommen, könnten Sie ein kartesische Verbindung zwischen Ihrem a und b-Tabellen (einem sehr lange, Speicher und CPU-intensiver Abfrage am Ende tun - es wird mit allen Zeilen in b in einem jede einzelne Zeile paßt Bad, wenn ein. und b sind große Tabellen zu beginnen). Mit JOIN eine explizite INNER ist sicherer und leichter zu lesen.

Kein Unterschied. Ich finde das erste Format besser lesbar und das zweite Format nur verwenden, wenn andere Arten von tun verbindet (OUTER, LEFT INNER, etc).

Die zweite Form ist SQL92-konforme Syntax. Dies sollte bedeuten, dass es von allen aktuellen und zukünftigen Datenbanken-Anbieter unterstützt wird. Allerdings ist die Wahrheit, dass die erste Form so allgegenwärtig ist, dass es auch länger sein, um garantiert ist, als wir kümmern.

Ansonsten sind sie in jeder Hinsicht gleich, wie Datenbanken, um die beiden zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top