Ответ 1
SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9
Выбор констант без ссылки на таблицу является совершенно законным в выражении SQL:
SELECT 1, 2, 3
Набор результатов, который возвращает последний, представляет собой одну строку, содержащую значения. Мне было интересно, есть ли способ выбрать несколько строк сразу, используя константное выражение, что-то вроде:
SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))
Я хотел бы, чтобы что-то вроде выше работало и возвращает набор результатов с 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
В Oracle
, SQL Server
и PostgreSQL
вы также можете создавать наборы записей произвольного количества строк (которые можно использовать с внешней переменной):
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
.
Попробуйте выполнить предложение connect by oracle, что-то вроде этого
select level,level+1,level+2 from dual connect by level <=3;
Для получения дополнительной информации о соединении по предложению перейдите по этой ссылке: удаленный URL-адрес, поскольку сайт oraclebin теперь злонамерен.
Следующая команда VALUES
работает для меня в PostgreSQL:
VALUES (1,2,3), (4,5,6), (7,8,9)
Oracle. Благодаря этому посту PL/SQL - используйте переменную "List" в пункте Where In
Я собрал свой пример, чтобы легко вводить значения вручную (будучи использованным при тестировании приложения тестерами):
WITH prods AS (
SELECT column_value AS prods_code
FROM TABLE(
sys.odcivarchar2list(
'prod1',
'prod2'
)
)
)
SELECT * FROM prods
Вот как я заполняю статические данные в Oracle 10+, используя аккуратный трюк XML.
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 );
Слияние только вставляет строки, отсутствующие в исходной таблице, что удобно если вы хотите повторно запустить свою вставку script.
SELECT *
FROM DUAL
CONNECT BY ROWNUM <= 9;
Для Microsoft SQL Server или PostgreSQL вы можете попробовать этот синтаксис
SELECT constants FROM (VALUES ('[email protected]'), ('[email protected]'), ('[email protected]')) AS MyTable(constants)
Вы также можете просмотреть SQL Fiddle здесь: http://www.sqlfiddle.com/#!17/9eecb/34703/0
Опция для 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;
Вот как это сделать, используя функции XML DB2
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 записей или использующая любую системную таблицу. Здесь мы не имеем отношения к данным этой таблицы.
Вы можете вносить вариации в набор результатов, объединяя столбец с первым, вторым и третьим столбцами из таблицы Any_Table_In_Your_DataBase
.
В MySQL вы можете делать: values (1,2), (3, 4);
mysql> values (1,2), (3, 4);
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
2 rows in set (0.004 sec)
С MySQL 8 также возможно дать имена столбцов:
mysql> SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d);
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
select (level - 1) * row_dif + 1 as a, (level - 1) * row_dif + 2 as b, (level - 1) * row_dif + 3 as c
from dual
connect by level <= number_of_rows;
что-то вроде того
select (level - 1) * 3 + 1 as a, (level - 1) * 3 + 2 as b, (level - 1) * 3 + 3 as c
from dual
connect by level <= 3;