SQL-Syntax: Wählen Sie ohne from-Klausel als Unterabfrage in select (subselect)

8

Beim Bearbeiten einiger Abfragen, um Alternativen für Spalten ohne Werte hinzuzufügen, habe ich versehentlich so etwas geschrieben (hier ist die vereinfachte Version):

%Vor%

Zu meiner Überraschung hat MySQL keinen Fehler ausgelöst, aber die Abfrage abgeschlossen, die meine erwarteten Ergebnisse liefert (die name Spaltenwerte). Ich habe versucht, irgendeine Dokumentation darüber zu finden, aber ohne Erfolg.

Ist das SQL-Standard oder eine MySQL-Spezialität? Kann ich sicher sein, dass das Ergebnis dieser Syntax tatsächlich der Spaltenwert aus derselben (äußeren) Tabelle ist? Die erweiterte Version wäre so:

%Vor%

aber die EXPLAIN meldet No tables used in der Extra Spalte für die frühere Version, was ich sehr schön finde.

Hier ist eine einfache Geige auf SqlFiddle (es hält das Timing für mich aus, ich hoffe, du hast mehr Glück) .

Klarstellung: Ich kenne Unterabfragen, aber ich schrieb immer Unterabfragen (korreliert oder nicht), die eine Tabelle zur Auswahl beinhalteten, was einen zusätzlichen Schritt im Ausführungsplan verursachte; Meine Frage bezieht sich auf diese Syntax und das Ergebnis, das es in MySQL gibt, scheint den erwarteten Wert ohne irgendwelche zurückzugeben.

    
watery 17.12.2015, 16:48
quelle

3 Antworten

2

Dies ist das Standardverhalten für die SQL-Sprache und es ist auf der SQL ANSI 2011 über ISO / IEC 9075-1: 2011 (en) Dokumentation. Leider ist es nicht geöffnet. Dieses Verhalten wird in Abschnitt 4.11 SQL-Anweisungen beschrieben.

Dieses Verhalten tritt auf, weil die Datenbanken das Select-Kommando ohne die from-Klausel verarbeiten, also wenn es auf Folgendes trifft:

%Vor%

Es wird versucht, das name -Feld als eine Spalte der zu bearbeitenden äußeren Abfragen zu finden.

Glücklicherweise erinnere ich mich, dass ich vor einiger Zeit geantwortet habe jemand hier und finden Sie einen gültigen verfügbaren Link zu einem SQL-ANSI-Dokument, das online in FULL ist, aber es ist für SQL ANSI 99 und der Abschnitt möglicherweise nicht derselbe wie das neue Dokument. Ich denke, habe nicht überprüft, dass es um den Abschnitt 4.30 geht. Schau mal. Und ich empfehle das Lesen wirklich (ich habe das damals gemacht).

Datenbanksprache SQL - ISO / IEC 9075-2: 1999 (D)

>     
Jorge Campos 18.12.2015, 12:35
quelle
3

Was Sie in Ihrer ersten Abfrage angeben, ist eine korrelierte Unterabfrage, die einfach die Spalte name aus der Tabelle t zurückgibt. Keine tatsächliche Unterabfrage muss hier ausgeführt werden (was dein EXPLAIN dir sagt).

  

In einer SQL-Datenbankabfrage wird eine korrelierte Unterabfrage (auch als a   synchronisierte Unterabfrage) ist eine Unterabfrage (eine Abfrage, die in einer anderen verschachtelt ist)   Abfrage), die Werte aus der äußeren Abfrage verwendet.

     

Ссылка

%Vor%

ist dasselbe wie

%Vor%

Ihre zweite Abfrage

%Vor%

Enthält auch eine korrelierte Unterabfrage, aber diese führt tatsächlich eine Abfrage in der Tabelle t durch, um Datensätze zu finden, in denen t1.id = t2.id.

    
KorreyD 17.12.2015 17:17
quelle
0

Es ist nicht Standard. In Orakel,

%Vor%

Fehler ausgelöst, ORA-00923: FROM keyword not found where expected

Wie können Sie sich Ihrer Ergebnisse sicher sein? Verstehen Sie besser, was die Abfrage erreichen soll, bevor Sie sie schreiben. Selbst die extended Version in der Frage macht keinen Sinn.

    
Dan Bracuk 17.12.2015 17:18
quelle

Tags und Links