你可以在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,但会对其他数据库感兴趣,可以做这样的事情。
我想你可以做一个子查询与几个SELECT
与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;
你可以在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)
不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行),因为它通常是非常有用的。