2009-06-12 10 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 

のようなものこれは、2つのまたは3つのクエリを実行するために持っ救う:参加にそれを使用して、その後、一時テーブルを作成し、そこにデータを置きます。

私はMySQLを使用していますが、そのようなことを行う可能性のある他のデータベースに興味があります。

答えて

42

UNIONを組み合わせたサブクエリを作成することができます。

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

+0

確かに、それは=) – Blixt

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

SELECT ....

読むと、よりにTEMPORARY TABLE(ID int型、名char(100))を作成します。http://dev.mysql.com/doc/refman/5.0/en/create-table.html

(底部付近)

これは、問題は、テーブル(データ型の不一致)のテーブルを自動的に削除されます。

早期回答ではFROM SELECT句が使用されました。可能であれば、それはテーブルを掃除の頭痛を節約するためにそれを使用してください。

FROM SELECTを使用した場合のデメリット(重要ではない)は、データセットの作成量が大きいことです。テンポラリテーブルを使用すると、重要なインデックスを作成することができます。後続の照会の場合。直感的ではないようですが、中規模のデータセット(〜1000行)であっても、クエリが操作されるためのインデックスを作成する方が早い場合があります。標準SQLでは

14

(SQL 2003からhttp://savage.net.au/SQL/を参照)を使用することができます:

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

をもう少し追跡して、あなたも使用することができます:MySQLでこれらの作業がある

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

かどうか別の問題ですが、いつでも追加したり、自分で追加したりすることができます(オープンソースの美しさです)。

+0

答えをありがとう!残念ながら、MySQL(5.0)はFROM TABLE(VALUES ...が好きではありませんが、少なくとも私は今それについて知っています – thomasrutter

+0

この回答は、おそらく受け入れられた回答よりも有益です。 – thomasrutter

+0

逆に、オープンソースの醜いことは、多くの人や自由時間を持つ開発者が興味を持っていない限り、無視されるか拒否されるかを問うことであり、DIYの学習曲線は次のとおりです。多くの場合、時間がかかりません(代替方法はもっと良いとは限りません)。 – Michael

0

言い換えれば、はい。 SQL製品が共​​通テーブル式(CTE)をサポートしている場合、つまり、サブクエリと同じCTEを使用するよりも目が簡単な場合は、さらに優れたIMOを複数回使用できます。このSQL Server 2005および上記で0と999の間で一意の整数のシーケンステーブル「を作成」に:あなたは、実際に、例えば、シーケンステーブルで有用な何かをしたい除い

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行)を持っています。

18

あなたは、PostgreSQLでそれを行うことができます。Microsoft T-SQL 2008で

=> select * from (values (1,7), (2,6), (3,13), (4,12), (5,9)) x(id, count); 
id | count 
----+------- 
    1 |  7 
    2 |  6 
    3 | 13 
    4 | 12 
    5 |  9 

http://www.postgresql.org/docs/8.2/static/sql-values.html

+0

PostgreSQL FTW。 –

+0

Spark SQLでも動作します。 – jab

11

をフォーマットは次のとおりです。

SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) AS MyTable(a, b) 

すなわち、上記のようにJonathanのように、しかし 'テーブル'キーワードなし。

参照: