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;
问问题
61657 次
4 回答
16
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 个 fileuid(如果从 0 开始,它将是 1,000 个)。
于 2009-09-11T23:44:22.937 回答
4
WITH x AS (...)
这将获取 的输出并将其暂时...
视为名为 的表。x
WITH x AS (...)
SELECT * FROM x
该语句本质上将为您提供与输出完全相同的内容,...
但它将被引用为表格x
于 2009-09-11T21:57:58.160 回答
0
WITH 字用于创建公用表表达式 (CTE)。在这种情况下,它正在创建一个内联表,“select fileUID, ...”部分从中提取数据。
于 2009-09-11T21:57:27.380 回答
0
它正在创建 CTE(通用表表达式)。这是一个基本上不需要创建、删除或声明的表。批处理运行后将自动删除。
于 2009-09-11T21:58:53.373 回答