sql - ¿Cómo seleccionar múltiples filas llenas de constantes?
select constants (11)
Seleccionar constantes sin consultar una tabla es perfectamente legal en una declaración SQL:
SELECT 1, 2, 3
El conjunto de resultados que este último devuelve es una sola fila que contiene los valores. Me preguntaba si hay una manera de seleccionar varias filas a la vez usando una expresión constante, algo así como:
SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))
Me gustaría que algo como lo anterior funcione y devuelva un conjunto de resultados con 3 filas y 3 columnas.
Aquí es cómo llenó datos estáticos en Oracle 10+ usando un truco de XML ordenado.
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 );
La combinación solo inserta las filas que faltan en la tabla original, lo cual es conveniente si desea volver a ejecutar su script de inserción.
Aquí se muestra cómo hacerlo usando las características XML de 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
;
De esta manera puede ayudarte
SELECT TOP 3
1 AS First,
2 AS Second,
3 AS Third
FROM Any_Table_In_Your_DataBase
Any_Table_In_Your_DataBase:
cualquier tabla que contenga más de 3 registros, o use cualquier tabla del sistema. Aquí no tenemos ninguna preocupación con los datos de esa tabla.
Puede traer variaciones en el conjunto de resultados al concatenar una columna con las columnas Primera, Segunda y Tercera de la tabla Any_Table_In_Your_DataBase
.
En PostgreSQL
, puedes hacer:
SELECT *
FROM (
VALUES
(1, 2),
(3, 4)
) AS q (col1, col2)
En otros sistemas, solo use 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
En Oracle
, SQL Server
y PostgreSQL
, también puede generar conjuntos de registros de número arbitrario de filas (providable con una variable externa):
SELECT level
FROM dual
CONNECT BY
level <= :n
en 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
en SQL Server
,
SELECT l
FROM generate_series(1, $n) l
en PostgreSQL
.
En Oracle
SELECT
CASE
WHEN level = 1
THEN ''HI''
WHEN level = 2
THEN ''BYE''
END TEST
FROM dual
CONNECT BY level <= 2;
Oráculo. Gracias a este post PL / SQL - Use la variable "List" en Where In Clause
Junté mi declaración de ejemplo que es fácil de ingresar valores manualmente (siendo reutilizados al probar una aplicación por probadores):
WITH prods AS (
SELECT column_value AS prods_code
FROM TABLE(
sys.odcivarchar2list(
''prod1'',
''prod2''
)
)
)
SELECT * FROM prods
Pruebe la cláusula connect by en oráculo, algo como esto
select level,level+1,level+2 from dual connect by level <=3;
Para obtener más información sobre la cláusula connect by, siga este enlace: URL eliminada porque el sitio oraclebin ahora es malicioso.
Seguir el comando bare VALUES
funciona para mí en PostgreSQL:
VALUES (1,2,3), (4,5,6), (7,8,9)
Una opción para 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
SELECT *
FROM DUAL
CONNECT BY ROWNUM <= 9;
SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9