web-dev-qa-db-ja.com

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を使用していますが、そのようなことができる他のデータベースに興味があります。

54
thomasrutter

複数のSELECTsをUNIONsと組み合わせてサブクエリを実行できると思います。

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;
53
Blixt

あなたは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

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

24
dvv

標準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で機能するかどうかは別の問題ですが、いつでも追加するように依頼することも、自分で追加することもできます(これがオープンソースの魅力です)。

18

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」キーワードがありません。

見る:

15
Pete

私はこのリンクを見つけました 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;
6
ole6ka

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行)でも、クエリを操作するためのインデックスを作成する方が高速です。

0
Pat

つまり、そうです。 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万行)のシーケンステーブルがあります。

0
onedaywhen