Cosa sta facendo l'istruzione WITH in questo esempio? Sto cercando di generare casualmente dati
-
06-07-2019 - |
Domanda
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;
Soluzione
La sintassi WITH è uguale all'utilizzo di una tabella temporanea locale o di una vista incorporata. Per quanto ne so, è supportato solo in SQL Server (2005+, chiamato Common Table Expressions) e Oracle (9i +, chiamato Subquery Factoring). L'uso previsto è per la creazione di una vista di base che viene utilizzata (ovvero: unita a) più volte in una singola query.
Ecco un tipico esempio:
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
... che restituirà risultati identici se si utilizza:
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
L'esempio che hai fornito:
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;
... è ricorsivo. Sta iniziando da 1, generando 999 fileuid in totale (sarebbero 1.000 se fosse iniziato a 0).
Altri suggerimenti
WITH x AS (...)
Questo prenderà l'output di ...
e lo tratterà temporaneamente come una tabella chiamata x
.
WITH x AS (...)
SELECT * FROM x
Questa affermazione essenzialmente ti darà esattamente la stessa cosa degli output ...
ma sarà invece indicata come tabella x
La parola WITH viene utilizzata per creare una Common Table Expression (CTE). In questo caso, sta creando una tabella incorporata che " select fileUID, ... " parte sta estraendo i dati da.
Sta creando CTE (Common Table Expression). Questa è sostanzialmente una tabella che non è necessario creare, eliminare o dichiarare in alcun modo. Verrà automaticamente eliminato dopo l'esecuzione del batch.
Scopri http://4guysfromrolla.com/webtech/071906-1.shtml per maggiori informazioni.