如何select多行填充常量?

在不涉及表的情况下select常量在SQL语句中是完全合法的:

SELECT 1, 2, 3 

后者返回的结果集是包含值的单个行。 我想知道是否有一种方法可以使用常量expression式一次select多行:

 SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9)) 

我想要像上面这样的工作,并返回一个结果集3行3列。

 SELECT 1, 2, 3 UNION ALL SELECT 4, 5, 6 UNION ALL SELECT 7, 8, 9 

PostgreSQL ,你可以这样做:

 SELECT * FROM ( VALUES (1, 2), (3, 4) ) AS q (col1, col2) 

在其他系统中,只需使用UNION ALL

 SELECT 1 AS col1, 2 AS col2 -- FROM dual -- uncomment the line above if in Oracle UNION ALL SELECT 3 AS col1, 3 AS col2 -- FROM dual -- uncomment the line above if in Oracle 

OracleSQL ServerPostgreSQL ,您也可以生成任意数量行的logging集(可以使用外部variables):

 SELECT level FROM dual CONNECT BY level <= :n 

Oracle

 WITH q (l) AS ( SELECT 1 UNION ALL SELECT l + 1 FROM q WHERE l < @n ) SELECT l FROM q -- OPTION (MAXRECURSION 0) -- uncomment line above if @n >= 100 

SQL Server

 SELECT l FROM generate_series(1, $n) l 

PostgreSQL

尝试oracle中的connect by子句,就像这样

 select level,level+1,level+2 from dual connect by level <=3; 

有关connect by子句的更多信息,请遵循以下链接:删除URL,因为oraclebin网站现在是恶意的。

在PostgreSQL中,下面的VALUES命令适用于我:

 VALUES (1,2,3), (4,5,6), (7,8,9) 

这里是我如何使用整洁的XML技巧在Oracle 10+中填充静态数据。

 create table prop (ID NUMBER, NAME varchar2(10), VAL varchar2(10), CREATED timestamp, CONSTRAINT PK_PROP PRIMARY KEY(ID) ); merge into Prop p using ( select extractValue(value(r), '/R/ID') ID, extractValue(value(r), '/R/NAME') NAME, extractValue(value(r), '/R/VAL') VAL from (select xmltype(' <ROWSET> <R><ID>1</ID><NAME>key1</NAME><VAL>value1</VAL></R> <R><ID>2</ID><NAME>key2</NAME><VAL>value2</VAL></R> <R><ID>3</ID><NAME>key3</NAME><VAL>value3</VAL></R> </ROWSET> ') xml from dual) input, table(xmlsequence(input.xml.extract('/ROWSET/R'))) r ) p_new on (p.ID = p_new.ID) when not matched then insert (ID, NAME, VAL, CREATED) values ( p_new.ID, p_new.NAME, p_new.VAL, SYSTIMESTAMP ); 

合并仅插入原始表中缺less的行,如果要重新运行插入脚本,这很方便。

 SELECT * FROM DUAL CONNECT BY ROWNUM <= 9; 

DB2的一个选项:

 SELECT 101 AS C1, 102 AS C2 FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT 201 AS C1, 202 AS C2 FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT 301 AS C1, 302 AS C2 FROM SYSIBM.SYSDUMMY1 

在Oracle中

 SELECT CASE WHEN level = 1 THEN 'HI' WHEN level = 2 THEN 'BYE' END TEST FROM dual CONNECT BY level <= 2; 

这里是如何使用DB2的XMLfunction来完成的

 SELECT * FROM XMLTABLE ('$doc/ROWSET/ROW' PASSING XMLPARSE ( DOCUMENT ' <ROWSET> <ROW> <A val="1" /> <B val="2" /> <C val="3" /> </ROW> <ROW> <A val="4" /> <B val="5" /> <C val="6" /> </ROW> <ROW> <A val="7" /> <B val="8" /> <C val="9" /> </ROW> </ROWSET> ') AS "doc" COLUMNS "A" INT PATH 'A/@val', "B" INT PATH 'B/@val', "C" INT PATH 'C/@val' ) AS X ; 

这样可以帮助你

 SELECT TOP 3 1 AS First, 2 AS Second, 3 AS Third FROM Any_Table_In_Your_DataBase 

Any_Table_In_Your_DataBase:包含超过3条logging的任何表,或者使用任何系统表。 这里我们不关心那张表的数据。

您可以通过连接来自Any_Table_In_Your_DataBase表的第一列,第二列和第三列的结果集来引入变体。