Działa to w głównych systemach zarządzania relacyjnymi bazami danych, które najprawdopodobniej pojawiają się na StackOverflow / dba.stackexchange, tj. SQL Server, MySQL, PostgreSQL i SQLite (WebSQL) .
select 'abc' abc, 1 def;
To nie działa na Oracle. Dlaczego musimy wybierać spośród DUAL w Oracle? Czy standard ISO / ANSI dla SQL wymaga klauzuli FROM dla instrukcji SELECT ?
Edytować:
Według Bacon Bit
odpowiedzi wydaje się, że jest to wymagane przez standard SQL.
Tak więc w rzeczywistości, ponieważ nazwa DUAL jest tak mylącą nazwą, gdybym miał stworzyć tabelę i nazwać ją ATOM lub JEDEN, np create table one (atom int);
. select 'abc' abc, 1 def FROM one;
- Czy w porównaniu z nią występuje utrata wydajności SELECT .. FROM DUAL
?
select
bezfrom
. DB2 ma podobną tabelę fikcyjną o nazwie SYSIBM.SYSDUMMY1 . Prawdopodobnie już to wiesz, ale kiedy tak naprawdę nie masz dostępuselect 'A' from dual
dodual
tabeli , co odpowiada na pytanie w twojej edycji (która zasługuje na nowe pytanie btw).FROM
klauzuli. Z góry mojej głowy: Informix, Firebird i Apache Derby również tego wymagają.values ('abc', 1)
. Możesz oczywiście również wybrać z takiego oświadczenia:select abc from ( values ('abc',1) ) as t(abc,def)
Odpowiedzi:
Ściśle, tak,
FROM
klauzulaSELECT
oświadczenia nie jest opcjonalna. Składnia SQL-99 wyszczególnia podstawoweSELECT
zestawienie, aFROM
klauzula nie zawiera nawiasów kwadratowych. Oznacza to, że standard uznaje go za nieobowiązkowy:W rzeczywistości, programiści i DBA często uważają, że przydatne jest wykonywanie innych czynności niż manipulowanie danymi w tabelach lub manipulowanie tabelami i strukturami danych. Tego rodzaju rzeczy w dużej mierze wykraczają poza zakres standardu SQL, który dotyczy danych więcej niż zwykłych implementacji. Czy chcemy uruchomić
SELECT getdate()
lubSELECT 1
lubSELECT DB_NAME()
(lub niezależnie od woli dialekt), to w rzeczywistości nie chcą dane z tabeli.Oracle wybiera rozwiązanie rozbieżności między standardem a implementacją za pomocą tabeli zastępczej o następującej skutecznej definicji:
Inne RDBMS zasadniczo zakładają, że używana jest tabela zastępcza, jeśli nie
FROM
określono nie.Historia DUAL tabeli jest na Wikipedii:
źródło
Zaletą
dual
jest to, że optymalizator rozumie, żedual
jest to specjalna tabela z jednym wierszem i jedną kolumną (zvarchar2
typem danych) - gdy używasz go w zapytaniach, wykorzystuje tę wiedzę przy opracowywaniu planu.Dlaczego musimy wybierać
dual
w Oracle?Możesz także wybierać spośród
dual
własnych stolików lub ze swoich stołów, możesz, jeśli chcesz.Dla mnie pozostanę,
dual
bo wiemdual
, że istnieje. Wiem, że ma co najmniej 1, a maksymalnie 1 wiersz. Wiem, że optymalizator wie wszystkodual
i robi dla mnie najbardziej wydajną rzecz. Optymalizator rozumie, żedual
to magiczny, specjalny 1-rzędowy stół. Zatrzymał się,select *
ponieważ musi tam być jeden rząd. Tak to działa.źródło
DUAL
. Bądź ostrożny!Pozostałe dwie odpowiedzi stanowią dobre tło dla mojej odpowiedzi.
W bazach danych Oracle jest tradycyjny i niezawodny. Nie powiedzie się w innych bazach danych, które nie mają
DUAL
tabeli. Nie jest konieczne, abyś używałDUAL
, ale polecam to zrobić.Bazy danych zgodne ze standardami będą wymagały
FROM
klauzuli określającej co najmniej odwołanie do tabeli. Jeśli masz tabelę ZAMÓWIENIAFROM DUAL
, działałaby następująca zamiana klauzuli:Zastąp dowolną tabelę lub widok, który możesz wybrać, i będzie działać. Zastąp tabelę lub widok, którego nie możesz wybrać, a to się nie powiedzie.
DUAL
jest bardziej niezawodny, ponieważ wykluczając złamanie DBA, wszyscy użytkownicy mogą z niego wybierać i otrzyma tylko jeden wiersz w zestawie wyników. (Czasami się psuje.)Nie znam standardowego czasownika dostępu do danych, których nie ma w tabeli bez odwołania do tabeli. Biorąc pod uwagę, jak mało dostępu do takich danych, nie widzę takiej potrzeby. Wiele przypadków, na które natrafiam, można lepiej traktować na różne sposoby.
źródło
SELECT CURRENT_TIMESTAMP FROM (VALUES(1)) V(C)
wierzę, że jest zgodny ze standardami i nie polega na żadnym konkretnym stole.