文字列で一時テーブルを定義できる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を使用していますが、そのようなことができる他のデータベースに興味があります。
複数の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;
あなたはPostgreSQLでそれを行うことができます:
=> 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
標準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で機能するかどうかは別の問題ですが、いつでも追加するように依頼することも、自分で追加することもできます(これがオープンソースの魅力です)。
Microsoft T-SQL 2008では、形式は次のとおりです。
SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b)
つまり上記のJonathanと同じですが、「table」キーワードがありません。
見る:
私はこのリンクを見つけました 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;
CREATE TEMPORARY TABLE(ID int、Name char(100))SELECT ....
続きを読む: http://dev.mysql.com/doc/refman/5.0/en/create-table.html
(下部近く)
これには、テーブルへの入力に問題がある場合(データ型の不一致)、テーブルが自動的に削除されるという利点があります。
初期の回答では、FROM SELECT句が使用されていました。テーブルを片付ける手間が省けるので、できればそれを使用してください。
FROM SELECTの短所(重要ではないかもしれません)は、作成されるデータセットの大きさです。一時テーブルでは、重要になる可能性のあるインデックス付けが可能です。後続のクエリ。直感に反するようですが、中規模のデータセット(約1000行)でも、クエリを操作するためのインデックスを作成する方が高速です。
つまり、そうです。 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列の文字を解析します。
ただし、リテラル値のみで構成されるこのテーブルを複数回または複数のクエリで使用している場合は、そもそもベーステーブルにしないでください。私が使用するすべてのデータベースには、整数(通常は10万行)のシーケンステーブルがあります。