Что делает с утверждением в этом примере? Я пытаюсь случайным образом генерировать данные
-
06-07-2019 - |
Вопрос
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;
Решение
Синтаксис с синтаксисом такой же, как и используя локальную таблицу Temp или встроенный вид. Насколько мне известно, он поддерживается только в SQL Server (2005+, называется общие выражения таблицы) и Oracle (9i +, называемый факторингом подзапроса). Предполагаемое использование предназначено для создания базового представления, который используется (т. Е. Присоединяется к) несколько раз в одном запросе.
Вот типичный пример:
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
... который вернет идентичные результаты, если вы используете:
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
Пример, который вы представили:
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;
... рекурсивный. Он начинается с 1, что генерирует 999 файлов Fileuids (это было бы 1000, если бы он начался в 0).
Другие советы
WITH x AS (...)
Это примет выпуск ...
и относиться к этому как таблицу с именем x
, временно.
WITH x AS (...)
SELECT * FROM x
Это утверждение, по сути даст вам то же самое, что ...
выходы, но вместо этого будет ссылаться на таблицу x
С словом используется для создания общего экспрессии таблицы (CTE). В этом случае он создает встроенный стол, что часть «выбора Fileuid, ...» вытягивает данные.
Это создает CTE (распространенное выражение таблицы). Это в основном таблица, которую вам не нужно создавать, падать или в любом случае объявлять. Он будет автоматически удален после RAN.
Проверить http://4guysfromrolla.com/webtech/071906-1.shtml для получения дополнительной информации.