你可以在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 

这将节省不得不做两到三个查询:创build临时表,将数据放在里面,然后在连接中使用它。

我正在使用MySQL,但会对其他数据库感兴趣,可以做这样的事情。

我想你可以做一个子查询与几个SELECTUNION结合。

 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 

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

在标准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) 

不pipe这些工作在MySQL中是不是一个单独的问题 – 但是你总是可以要求添加它,或者自己添加它(这就是开源的美丽)。

在Microsoft T-SQL 2008中,格式是:

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

即乔纳森上面提到的,但没有“表”的关键字。

看到:

  • FROM(T-SQL MSDN文档) (在derived-table下)和
  • 表值构造器(T-SQL MSDN文档)

我发现这个链接与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

(靠近底部)

这样做的好处是,如果填充表时有任何问题(数据types不匹配),表将自动丢弃。

早期的答案使用了一个FROM SELECT子句。 如果可能的话使用,因为它节省了清理桌子的头痛。

FROM SELECT的缺点(这可能并不重要)是创build的数据集有多大。 临时表允许索引,这可能是关键。 用于后续的查询。 似乎违反直觉,但即使使用中等大小的数据集(约1000行),为查询操作而创build索引的速度也会更快。

总之,是的。 甚至更好的IMO如果你的SQL产品支持通用表expression式(CTE),比使用子查询加上相同的CTE可以多次使用,例如这个在SQL中0到999之间创build一个唯一整数的序列表Server 2005及以上版本:

 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行),因为它通常是非常有用的。