2009-06-12 12 views
43

Czy istnieje jakakolwiek składnia podkwerend SQL, która pozwala zdefiniować, dosłownie, tabelę tymczasową?Czy można zdefiniować "literalne" tabele w SQL?

Na przykład coś takiego

SELECT 
    MAX(count) AS max, 
    COUNT(*) AS count 
FROM 
    (
    (1 AS id, 7 AS count), 
    (2, 6), 
    (3, 13), 
    (4, 12), 
    (5, 9) 
) AS mytable 
    INNER JOIN someothertable ON someothertable.id=mytable.id 

Pozwoliłoby to zaoszczędzić konieczności zrobić dwa lub trzy pytania: tworzenie tabeli tymczasowej, wprowadzanie danych w nim, a następnie używając go w przyłączyć.

Używam MySQL, ale byłbym zainteresowany innymi bazami danych, które mogłyby zrobić coś takiego.

Odpowiedz

42

Przypuszczam, że można wykonać podzapytanie z kilkoma SELECT s w połączeniu z UNION s.

SELECT a, b, c, d 
FROM (
    SELECT 1 AS a, 2 AS b, 3 AS c, 4 AS d 
    UNION ALL 
    SELECT 5 , 6, 7, 8 
) AS temp; 
+0

Wow, to twórcze rozwiązanie! Wygląda na to, że przynajmniej zadziała. – thomasrutter

+0

Rzeczywiście, robi to =) – Blixt

6

znalazłem ten link Temporary Tables With MySQL

CREATE TEMPORARY TABLE TempTable (ID int, Name char(100)) TYPE=HEAP; 

INSERT INTO TempTable VALUES(1, "Foo bar"); 

SELECT * FROM TempTable; 

DROP TABLE TempTable; 
0

utworzenia tymczasowej tabeli (ID int, nazwa char (100)) SELECT ....

Czytaj więcej na: http://dev.mysql.com/doc/refman/5.0/en/create-table.html

(pod dnem)

Ma to tę zaletę, że jeśli jest jakakolwiek problem zapełnianie tabeli (niedopasowanie typu danych) tabela jest automatycznie odrzucana.

Wczesna odpowiedź wykorzystała klauzulę FROM SELECT. Jeśli to możliwe, użyj go, ponieważ oszczędza ból głowy podczas sprzątania stołu.

Wadą (która nie musi mieć znaczenia) z FROM SELECT jest wielkość utworzonego zestawu danych. Tabela tymczasowa pozwala na indeksowanie, które może mieć kluczowe znaczenie. Dla kolejnego zapytania. Wydaje się to być sprzeczne z intuicją, ale nawet z zestawem danych średniej wielkości (~ 1000 wierszy), szybciej może być utworzony indeks dla zapytania, na którym ma działać.

14

W standardzie SQL (SQL 2003 - zobacz http://savage.net.au/SQL/) można użyć:

INSERT INTO SomeTable(Id, Count) VALUES (1, 7), (2, 6), (3, 13), ... 

z nieco bardziej goni, można również użyć:

SELECT * FROM TABLE(VALUES (1,7), (2, 6), (3, 13), ...) AS SomeTable(Id, Count) 

Czy te prace w MySQL jest Oddzielny numer - ale zawsze możesz poprosić o dodanie go lub dodać go samodzielnie (to jest piękno Open Source).

+0

Dzięki za odpowiedź! Niestety MySQL (5.0) nie lubi FROM TABLE (VALUES ... ale przynajmniej wiem o tym teraz – thomasrutter

+0

Ta odpowiedź jest prawdopodobnie bardziej pouczająca niż przyjęta odpowiedź, to po prostu nie rozwiązało mojego osobistego problemu, ponieważ byłem – thomasrutter

+0

Przeciwnie, brzydkie z Open Source jest, pytanie zostanie zignorowane lub odrzucone, chyba że wiele osób i/lub programista z wolnym czasem jest zainteresowany, a krzywa uczenia się dla DIY jest często czas wygórowany (nie twierdząc, że alternatywa jest w jakikolwiek sposób lepsza ...) – Michael

0

Jednym słowem, tak. Jeszcze lepsze IMO, jeśli twój produkt SQL obsługuje typowe wyrażenia tabelowe (CTE), tj. Łatwiejsze dla oka niż użycie podzapytania plus ten sam CTE może być użyty wiele razy, na przykład to do „tworzenia” tabeli sekwencji unikalnych liczb całkowitych od 0 do 999 w SQL Server 2005 i powyżej:

WITH Digits (nbr) AS 
(
SELECT 0 AS nbr UNION ALL SELECT 1 UNION ALL SELECT 2 
UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 
UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
UNION ALL SELECT 9 
), 
Sequence (seq) AS 
(
SELECT Units.nbr + Tens.nbr + Hundreds.nbr 
    FROM Digits AS Units 
     CROSS JOIN Digits AS Tens 
     CROSS JOIN Digits AS Hundreds 
) 
SELECT S1.seq 
    FROM Sequence AS S1; 

wyjątkiem ciebie, że rzeczywiście zrobić coś pożytecznego z tabeli sekwencji np analizować znaki z kolumny VARCHAR w tabeli bazowej.

JEDNAKŻE, jeśli używasz tej tabeli, która składa się tylko z wartości literalnych, wielokrotnego czasu lub z wielu zapytań, dlaczego nie zrobić z niej tabeli bazowej? Każda baza danych, której używam, ma tabelę sekwencji liczb całkowitych (zwykle 100 wierszy), ponieważ jest ogólnie przydatna.

Powiązane problemy