2009-06-12 17 views
43

是否有任何SQL子查詢語法,可以讓你從字面上定義臨時表?你可以在SQL中定義「文字」表嗎?

例如,像

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 

這將節省不必做兩個或三個查詢:創建臨時表,將數據放入它,然後在加入使用它。

我正在使用MySQL,但會對其他可以做類似事情的數據庫感興趣。

回答

42

我想你可以做一個子查詢與幾個SELECT s的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

哇,這是一個創造性的解決方案!聽起來至少會起作用。 – thomasrutter 2009-06-12 06:46:19

+0

確實,它確實=) – Blixt 2009-06-12 06:49:11

6

我發現這個鏈接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

創建臨時表(ID INT,名稱char(100))SELECT ....

閱讀更多:http://dev.mysql.com/doc/refman/5.0/en/create-table.html

(靠近底部)

這具有如下優點:如果有填充表的問題(數據類型不匹配)表將自動丟棄。

早期的答案使用FROM SELECT子句。如果可能的話使用它,因爲它可以節省清理桌面的頭痛。

使用FROM SELECT的缺點(這可能無關緊要)是創建的數據集有多大。臨時表允許索引,這可能是關鍵。用於後續查詢。似乎違反直覺,但即使使用中等大小的數據集(〜1000行),爲查詢創建索引也可以更快。

14

在標準的SQL(SQL 2003 - 見http://savage.net.au/SQL/),您可以使用:

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

有了更多的追逐,你也可以使用:

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

無論是在MySQL的這些作品是單獨的問題 - 但您可以隨時要求添加它,或自己添加它(這是開源的美麗)。

+0

感謝您的答案!不幸的是,MySQL(5.0)不喜歡FROM TABLE(VALUES ...但至少我現在知道它 – thomasrutter 2009-06-12 07:09:20

0

總而言之,是的。如果您的SQL產品支持常用表表達式(CTE),即使用子查詢加上相同的CTE,也可以多次使用這對「創造」 0和999之間的唯一整數的SQL Server 2005和上面的序列表:

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; 

除非你確實想做些有意義的事與序列表例如從基表中分析VARCHAR列中的字符。

但是,如果你正在使用這個表,其中只包含文字值,多個時間或多個查詢,那麼爲什麼不讓它擺在首位的基表?我使用的每個數據庫都有一個整數序列表(通常爲100K行),因爲它通常非常有用。

相關問題