Aus Wikipedia :
Die DUAL-Tabelle ist eine spezielle einzeilige Tabelle, die standardmäßig in allen Oracle-Datenbankinstallationen vorhanden ist. Es eignet sich zur Auswahl einer Pseudospalte wie SYSDATE oder USER. Die Tabelle enthält eine einzelne VARCHAR2 (1) -Spalte namens DUMMY mit dem Wert 'X'.
Somit ist die Doppeltabelle eine Möglichkeit, Operationen an einer leeren, aber nicht leeren Tabelle durchzuführen. Dies ist nützlich, wenn man sich nicht um die Tabelle kümmert, sondern Operationen über eine select-Anweisung ausführen muss. Wenn die Tabelle mehr als eine Zeile oder Spalte enthält, werden mehrere Ergebnisse zurückgegeben (da bei der Ausführung der Operation die gesamte Tupelmenge berücksichtigt wird).
Es sollte nicht in der Produktion verwendet werden, es sei denn, Sie müssen bestimmte Prozeduren speziell über SQL aufrufen.
4*5
ist eine mathematische Operation, genau wie 'Foo'
eine Zeichenfolge. So wie man 4 * 5 aus jeder Tabelle auswählen kann, so wie man 'Foo' aus jeder Tabelle auswählen kann, ist DUAL eine Möglichkeit, es aus einer bekanntermaßen guten Tabelle auszuwählen, die niemals mehrere Ergebnisse liefert.
Aus der Dokumentation (CONCEPTS):
DUAL ist eine kleine Tabelle im Datenwörterbuch, auf die Oracle Database und benutzerdefinierte Programme verweisen können, um ein bekanntes Ergebnis zu gewährleisten. Die Doppeltabelle ist nützlich, wenn ein Wert nur einmal zurückgegeben werden muss, z. B. das aktuelle Datum und die aktuelle Uhrzeit. Alle Datenbankbenutzer haben Zugriff auf DUAL.
Die DUAL-Tabelle enthält eine Spalte mit dem Namen DUMMY und eine Zeile mit dem Wert X.
Und die SQL-Referenz :
DUAL ist eine Tabelle, die von Oracle Database automatisch zusammen mit dem Datenwörterbuch erstellt wird. DUAL befindet sich im Schema des Benutzers SYS, ist jedoch für alle Benutzer unter dem Namen DUAL zugänglich. Die Spalte DUMMY ist als VARCHAR2 (1) definiert und enthält eine Zeile mit dem Wert X. Die Auswahl aus der DUAL-Tabelle ist nützlich, um mit der SELECT-Anweisung einen konstanten Ausdruck zu berechnen. Da DUAL nur eine Zeile enthält, wird die Konstante nur einmal zurückgegeben. Alternativ können Sie eine Konstante, eine Pseudospalte oder einen Ausdruck aus einer beliebigen Tabelle auswählen. Der Wert wird jedoch so oft zurückgegeben, wie Zeilen in der Tabelle vorhanden sind. Unter "Informationen zu SQL-Funktionen" finden Sie viele Beispiele für die Auswahl eines konstanten Werts aus DUAL.
Ab Oracle Database 10g Release 1 wird keine logische E / A für die DUAL-Tabelle ausgeführt, wenn ein Ausdruck berechnet wird, der die DUMMY-Spalte nicht enthält. Diese Optimierung ist im Ausführungsplan als FAST DUAL aufgeführt. Wenn Sie die Spalte DUMMY aus DUAL AUSWÄHLEN, findet diese Optimierung nicht statt und es erfolgt eine logische E / A.
DUAL
ist eine Tabelle mit genau einer Zeile, wie die folgende SQL-Anweisung zeigt:Ihre
dual2
Tabelle enthält keine Zeilen. Wenn Sie eine einfügen, sehen Sie das gleiche Verhalten.4 * 5 ist ein Ausdruck, den Oracle auswerten kann, ohne tatsächlich Daten aus der Tabelle zu verwenden. Es wird einmal für jede Zeile ausgewertet, genau wie bei einem normalen Spaltenausdruck. Wenn also keine Zeile vorhanden ist, wird kein Ergebnis zurückgegeben. Wenn zwei Zeilen vorhanden sind, erhalten Sie die 20 zweimal.
quelle
Die
dual
Tabelle "funktioniert" fast genauso wie jede andere Tabelle: Es handelt sich um eine Tabelle, aus der Sie Datensätze auswählen können.So können Sie beispielsweise die Tabelle beschreiben. Hier in
SQL*Plus
:Die Tabelle hat also eine Spalte mit dem Namen
dummy
avarchar2(1)
.Die Tabelle enthält standardmäßig einen Datensatz (zumindest, wenn niemand daran herumgespielt hat):
Um dasselbe Verhalten
dual2
wie mitdual
zu erzielen, müssen Sie einen Datensatz in dual einfügen. Besser noch, erstelle es mit einemcreate table as select
(ctas):Jetzt funktioniert Ihre Abfrage:
Zuvor habe ich gesagt, dass Dual fast wie jeder andere Tisch funktioniert. Also, wenn es nicht funktioniert wie jede andere Tabelle?
Es verhält sich anders, wenn kein Wert aus der Tabelle selbst ausgewählt ist. Auch bei Ihren Fragen lasse ich Oracle erklären ...
... um zu sehen, wie auf die Tabelle zugegriffen wird:
Es ist ersichtlich, dass die Anweisung a
full table access
ondual2
.Nun dasselbe mit
dual
:Hier
dual
verhält sich die Tabelle anders: Der Wert vondummy
wird nicht benötigt, daher wird einefast dual
Operation ausgeführt, damit die Instanz den tatsächlichen Wert auf der Festplatte nicht liest.quelle
Übrigens ist DUAL eine der wenigen Tabellen, die funktionieren, wenn die Instanz gestartet wurde, die Datenbank jedoch nicht geöffnet wurde.
Du bekommst so etwas wie
quelle
Zusätzlich zu anderen Antworten ist Oracle nicht so wählerisch in Bezug auf den SQL-Text für Leerzeichen (zumindest an einigen Stellen). Der SQL-Parser wird in einigen Fällen auch durch Zeichenklassenunterschiede und nicht nur durch Leerzeichen gekennzeichnet.
Beispielsweise können Sie solche Anweisungen ausführen:
Es ist auch möglich, SQL ohne Leerzeichen auszuführen:
Ich habe hier noch einige Beispiele:
http://blog.tanelpoder.com/2008/01/14/can-you-write-a-working-sql-statement-without-using-any-whitespace/
Tanel Poder
quelle
Eine schnelle Dual-Operation schreibt Ihren Code neu, um x $ dual abzufragen. Da diese "Tabelle" eine C-Datenstruktur in der SGA ist, können Sie sie im Nomount-Modus abfragen.
quelle
Die Frage ist bereits beantwortet. Dies sind einige Hinweise zum Zweck der Doppeltabelle. Dual kann verwendet werden, um Ausdrücke in einer select-Klausel auszuwerten. Viele andere Datenbanksysteme benötigen für diesen Zweck keine solche Tabelle. MS SQL Server, MySQL, Posgres können die folgende Anweisung auswerten
Oracle kann nicht. Eine Oracle Select-Anweisung benötigt immer eine "from" -Klausel.
Einige Funktionen können nicht in pl / sql-Ausdrücken wie DUMP verwendet werden .
So
wird aber eine ausnahme auslösen
wird funktionieren.
Es kann verwendet werden, um die Ergebnismenge einer Abfrage zu erweitern
was gab
oder generieren Sie Daten mit ausgewählten Abfragen, indem Sie entweder
CONNECT BY
:oder ein rekursiver CTE:
was zurückkehrt
in sqlfiddle
quelle
Für das, was es wert ist, funktioniert es in MySQL genauso.
Und es scheint, dass DUAL auch in MySQL eine Art Speicherstruktur hat. Beachten Sie den Unterschied in den beiden EXPLAIN-Plänen - "Keine Tabellen verwendet" für DUAL in MySQL.
Interessanterweise kann ich mit MySQLs Dual keinen DESC durchführen, der sich von Oracle unterscheidet. Es wurde jedoch speziell AIUI eingeführt, damit die Oracle-Syntax unter MySQL funktioniert.
quelle
In der Oracle-Datenbank wird Dual-Tabelle grundsätzlich verwendet, um den Wert von Pseudospalten abzurufen. Es enthält folgende Eigenschaften:
Wenn Sie mehr Details erfahren möchten, klicken Sie hier
quelle