mysql-您可以在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,但会对其他可以做类似事情的数据库感兴趣。

thomasrutter asked 2019-11-18T04:04:03Z
7个解决方案
53 votes

我想您可以用几个SELECTUNIONs组合在一起做一个子查询。

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;
Blixt answered 2019-11-18T04:04:28Z
24 votes

您可以在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]

dvv answered 2019-11-18T04:04:59Z
19 votes

在标准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中是否起作用是一个单独的问题-但您始终可以要求将其添加或自己添加(这就是开源的魅力)。

Jonathan Leffler answered 2019-11-18T04:05:37Z
15 votes

在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'关键字。

看到:

  • FROM(T-SQL MSDN文档)(在派生表下),和
  • 表值构造函数(T-SQL MSDN文档)
Pete answered 2019-11-18T04:06:23Z
6 votes

我发现此链接与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;
ole6ka answered 2019-11-18T04:06:46Z
0 votes

创建临时表(ID int,名称char(100))SELECT ....

阅读更多信息:[http://dev.mysql.com/doc/refman/5.0/en/create-table.html]

(靠近底部)

这样做的好处是,如果在填充表时遇到任何问题(数据类型不匹配),则会自动删除该表。

较早的答案是使用FROM SELECT子句。 如果可能的话,使用它,因为这样可以省去清理桌子的麻烦。

FROM SELECT的缺点(可能不重要)是创建的数据集的大小。 临时表允许可能很关键的索引。 对于后续查询。 似乎违反直觉,但是即使使用中等大小的数据集(约1000行),创建索引以进行查询操作也可能更快。

Pat answered 2019-11-18T04:07:44Z
0 votes

一言以蔽之。 如果您的SQL产品支持公用表表达式(CTE),则更好的IMO,即比使用子查询更容易看到,并且可以多次使用相同的CTE,例如 在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;

除非您实际上会对Sequence表做一些有用的事情,例如 从基表的VARCHAR列中解析字符。

但是,如果使用的表仅由文字值,多次或多次查询组成,那么为什么不首先使其成为基本表呢? 我使用的每个数据库都有一个整数序列表(通常为10万行),因为它通常如此有用。

onedaywhen answered 2019-11-18T04:08:26Z
translate from https://stackoverflow.com:/questions/985295/can-you-define-literal-tables-in-sql