Das Auswählen von Konstanten ohne Bezugnahme auf eine Tabelle ist in einer SQL-Anweisung absolut zulässig:
SELECT 1, 2, 3
Die Ergebnismenge, die der letztere zurückgibt, ist eine einzelne Zeile, die die Werte enthält. Ich habe mich gefragt, ob es eine Möglichkeit gibt, mehrere Zeilen auf einmal mit einem konstanten Ausdruck auszuwählen.
SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))
Ich möchte so etwas wie das Obige, das funktioniert und eine Ergebnismenge mit 3 Zeilen und 3 Spalten zurückgibt.
SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9
In PostgreSQL
können Sie Folgendes tun:
SELECT *
FROM (
VALUES
(1, 2),
(3, 4)
) AS q (col1, col2)
Verwenden Sie in anderen Systemen einfach 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
In Oracle
, SQL Server
und PostgreSQL
können Sie auch Recordsets mit einer beliebigen Anzahl von Zeilen generieren (die mit einer externen Variablen versehen werden können):
SELECT level
FROM dual
CONNECT BY
level <= :n
in 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
in SQL Server
,
SELECT l
FROM generate_series(1, $n) l
in PostgreSQL
.
Versuchen Sie es mit der Klausel connect by in Oracle
select level,level+1,level+2 from dual connect by level <=3;
Für weitere Informationen zu connect by-Klausel klicken Sie auf diesen Link: URL wurde entfernt, da die oraclebin-Site jetzt schädlich ist.
Der folgende Befehl VALUES
funktioniert in PostgreSQL für mich:
VALUES (1,2,3), (4,5,6), (7,8,9)
Für Microsoft SQL Server oder PostgreSQL können Sie diese Syntax ausprobieren
SELECT constants FROM (VALUES ('[email protected]'), ('[email protected]'), ('[email protected]')) AS MyTable(constants)
Sie können auch ein SQL anzeigen Fiddle hier: http://www.sqlfiddle.com/#!17/9eecb/34703/
So fülle ich statische Daten in Oracle 10+ mit einem sauberen XML-Trick aus.
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 );
Bei der Zusammenführung werden nur die fehlenden Zeilen in die ursprüngliche Tabelle eingefügt. Dies ist praktisch, wenn Sie das Einfügungsskript erneut ausführen möchten.
SELECT *
FROM DUAL
CONNECT BY ROWNUM <= 9;
Oracle . Dank dieses Beitrags PL/SQL - Verwenden Sie "List" -Variable in Where In-Klausel
Ich habe meine Beispielaussage zusammengestellt, die einfach manuell eingegeben werden kann (wird beim Testen einer Anwendung von Testern wiederverwendet):
WITH prods AS (
SELECT column_value AS prods_code
FROM TABLE(
sys.odcivarchar2list(
'prod1',
'prod2'
)
)
)
SELECT * FROM prods
In MySQL können Sie Folgendes tun: values (1,2), (3, 4);
mysql> values (1,2), (3, 4);
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
2 rows in set (0.004 sec)
Mit MySQL 8 können auch die Spaltennamen angegeben werden:
mysql> SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d);
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
Eine Option für 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
Dieser Weg kann Ihnen helfen
SELECT TOP 3
1 AS First,
2 AS Second,
3 AS Third
FROM Any_Table_In_Your_DataBase
Any_Table_In_Your_DataBase:
eine Tabelle, die mehr als 3 Datensätze enthält, oder eine beliebige Systemtabelle verwenden. Hier haben wir nichts mit den Daten dieser Tabelle zu tun.
Sie können Variationen in der Ergebnismenge erzeugen, indem Sie eine Spalte mit der ersten, zweiten und dritten Spalte der Any_Table_In_Your_DataBase
-Tabelle verketten.
In Oracle
SELECT
CASE
WHEN level = 1
THEN 'HI'
WHEN level = 2
THEN 'BYE'
END TEST
FROM dual
CONNECT BY level <= 2;
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;
sowas in der Art
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;
Gehen Sie wie folgt vor, um die XML-Funktionen von DB2 zu verwenden
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
;