在这个例子中,WITH语句是做什么的?我正在尝试随机生成数据

时间:2009-09-11 21:55:54

标签: sql sql-server tsql with-statement

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 个答案:

答案 0 :(得分:15)

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个文件(如果从0开始则为1,000)。

答案 1 :(得分:4)

WITH x AS (...)

这将获取...的输出,并暂时将其视为名为x的表。

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

此语句基本上会为您提供与...输出完全相同的内容,但它将被引用为表x

答案 2 :(得分:0)

WITH字用于创建公用表表达式(CTE)。在这种情况下,它正在创建一个内联表,“select fileUID,...”部分正在从中提取数据。

答案 3 :(得分:0)

正在创建CTE(公用表表达式)。这基本上是一个表,无论如何都不必创建,删除或声明。批处理运行后,它将自动删除。

查看http://4guysfromrolla.com/webtech/071906-1.shtml了解详情。