74

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

4

8 に答える 8

65

SELECT複数の s を s と組み合わせてサブクエリを実行できると思います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;
于 2009-06-12T06:44:23.570 に答える
32

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

于 2011-06-12T21:35:48.880 に答える
22

Microsoft T-SQL 2008 の形式は次のとおりです。

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

つまり、ジョナサンが上で述べたように、「テーブル」キーワードはありません。

見る:

于 2013-06-03T22:36:13.463 に答える
6

このリンクを見つけました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;
于 2009-06-12T06:49:25.260 に答える
5

MariaDB v10.3.3 と MySQL v8.0.19 から、まさにそれができるようになりました!

ドキュメントを参照してください: MariaDBMySQL

マリアDB:

WITH literaltable (id,count) AS (VALUES (1,7),(2,6),(3,13),(4,12),(5,9))
SELECT MAX(count) AS max,COUNT(*) AS count FROM literaltable

ここでは a を使用しました。WITHこれは、MariaDB が に適切な列名を提供していないためですVALUES ...。列名なしでユニオンで使用できます。

SELECT 1 AS id,7 AS count UNION ALL VALUES (2,6),(3,13),(4,12),(5,9) ORDER BY count DESC

ドキュメントには言及されていないようですが、トップレベルのクエリとして使用することもできます。

VALUES (1,7),(2,6),(3,13),(4,12),(5,9) ORDER BY 2 DESC

実際の列名は、実際には値の最初の行にすぎないため、これを行うこともできます (ただし、エレガントではなく、列名の重複エラーが発生する可能性があります)。

SELECT MAX(`7`) AS max,COUNT(*) AS count FROM (VALUES (1,7),(2,6),(3,13),(4,12),(5,9)) literaltable

MySQL:

現在、テストするMySQL v8.0.19のインスタンスはありませんが、ドキュメントによると、これらのいずれかが機能するはずです:

SELECT MAX(column_1) AS max,COUNT(*) AS count FROM (VALUES ROW(1,7), ROW(2,6), ROW(3,13), ROW(4,12), ROW(5,9)) literaltable

SELECT MAX(data) AS max,COUNT(*) AS count FROM (VALUES ROW(1,7), ROW(2,6), ROW(3,13), ROW(4,12), ROW(5,9)) literaltable(id,data)

MariaDB とは異なり、MySQL は column_0、column_1、column_2 などの自動列名を提供し、参照時にサブクエリのすべての列の名前変更もサポートします。

確かではありませんが、この開発作業ログ ページは、MySQL が短い構文 (MariaDB のように "ROW" を省略) を実装したか、近い将来実装することを示唆しているようです。

于 2021-06-08T15:50:58.123 に答える