¿Qué está haciendo la instrucción WITH en este ejemplo? Estoy tratando de generar datos al azar
-
06-07-2019 - |
Pregunta
INSERT INTO files (fileUID, filename)
WITH fileUIDS(fileUID) AS
( VALUES(1) UNION ALL
SELECT fileUID+1 FROM fileUIDS WHERE fileUID < 1000 )
SELECT fileUID,
TRANSLATE ( CHAR(BIGINT(RAND() * 10000000000 )), 'abcdefgHij', '1234567890' )
FROM fileUIDS;
Solución
La sintaxis WITH es igual que usar una tabla temporal local o una vista en línea. Que yo sepa, solo es compatible con SQL Server (2005+, llamado Common Table Expressions) y Oracle (9i +, llamado Subquery Factoring). El uso previsto es para crear una vista básica que se usa (es decir, se une a) varias veces en una sola consulta.
Aquí hay un ejemplo típico:
WITH example AS (
SELECT q.question_id,
t.tag_name
FROM QUESTIONS q
JOIN QUESTION_TAG_XREF qtf ON qtf.question_id = t.question_id
JOIN TAGS t ON t.tag_id = qtf.tag_id)
SELECT t.title,
e1.tag_name
FROM QUESTIONS t
JOIN example e1 ON e1.question_id = t.question_id
... que devolverá resultados idénticos si usa:
SELECT t.title,
e1.tag_name
FROM QUESTIONS t
JOIN (SELECT q.question_id,
t.tag_name
FROM QUESTIONS q
JOIN QUESTION_TAG_XREF qtf ON qtf.question_id = t.question_id
JOIN TAGS t ON t.tag_id = qtf.tag_id) e1 ON e1.question_id = t.question_id
El ejemplo que proporcionó:
WITH fileUIDS(fileUID) AS (
VALUES(1)
UNION ALL
SELECT t.fileUID+1
FROM fileUIDS t
WHERE t.fileUID < 1000 )
INSERT INTO files
(fileUID, filename)
SELECT f.fileUID,
TRANSLATE ( CHAR(BIGINT(RAND() * 10000000000 )), 'abcdefgHij', '1234567890' )
FROM fileUIDS f;
... es recursivo. Está comenzando en 1, generando 999 fileuids en total (serían 1,000 si hubiera comenzado en 0).
Otros consejos
WITH x AS (...)
Esto tomará la salida de ...
y la tratará como una tabla llamada x
, temporalmente.
WITH x AS (...)
SELECT * FROM x
Esta declaración esencialmente le dará exactamente lo mismo que las salidas ...
pero en su lugar se hará referencia a ella como la tabla x
La palabra WITH se usa para crear una expresión de tabla común (CTE). En este caso, está creando una tabla en línea en la que " seleccione fileUID, ... " parte está extrayendo datos.
Está creando CTE (expresión de tabla común). Esta es básicamente una tabla que no tiene que crear, descartar o declarar de todos modos. Se eliminará automáticamente después de que se haya ejecutado el lote.
Vea http://4guysfromrolla.com/webtech/071906-1.shtml para más información.