Что делает оператор WITH в этом примере? Я пытаюсь случайным образом генерировать данные - PullRequest
5 голосов
/ 12 сентября 2009
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;

Ответы [ 4 ]

15 голосов
/ 12 сентября 2009

Синтаксис WITH такой же, как при использовании локальной временной таблицы или встроенного представления. Насколько мне известно, он поддерживается только в SQL Server (2005+, называемый Common Table Expressions) и Oracle (9i +, называемый Subquery Factoring). Предполагаемое использование для создания базового представления, которое используется (то есть: присоединяется) несколько раз в одном запросе.

Вот типичный пример:

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 файловых файлов (было бы 1000, если бы он начинался с 0).

4 голосов
/ 12 сентября 2009
WITH x AS (...)

Это будет принимать вывод ... и временно обрабатывать его как таблицу с именем x.

WITH x AS (...)
SELECT * FROM x

Это утверждение, по сути, даст вам то же самое, что и ... выходные данные, но вместо этого оно будет упоминаться как таблица x

0 голосов
/ 12 сентября 2009

Создает CTE (общее табличное выражение). Это в основном таблица, которую вам не нужно ни создавать, ни удалять, ни декларировать. Он будет автоматически удален после запуска пакета.

Проверьте http://4guysfromrolla.com/webtech/071906-1.shtml для получения дополнительной информации.

0 голосов
/ 12 сентября 2009

Слово WITH используется для создания общего выражения таблицы (CTE). В этом случае создается встроенная таблица, из которой часть «select fileUID, ...» извлекает данные.

...