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

标签 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;

最佳答案

WITH 语法与使用本地临时表或内联 View 相同。据我所知,它仅在 SQL Server(2005+,称为通用表表达式)和 Oracle(9i+,称为子查询分解)中受支持。预期用途是创建在单个查询中多次使用(即连接)的基本 View 。

这是一个典型的例子:

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 个)。

关于sql - 在这个例子中,WITH 语句做了什么?我正在尝试随机生成数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1413465/

相关文章:

sql - 我应该使用数字还是字母数字 ID

Java - 将当前日期保存到sql数据库(时间字段)

sql - 检查 SQL 中的日期是否重叠

sql-server - "Create Statistics"在 SQL Server 2005 中起什么作用?

sql-server - 如何防止 SQL Server 连接具有相同名称的 XML 结果

mysql - 通过 mysql 存储过程的 'where clause' 中的未知列

mysql - 在不同数据库的表之间传输行

sql - 在 SQL Server 中使用 EXCEPT 和 DISTINCT

sql-server - SQL Server 将 View 查询中的 LEFT JOIN 替换为 LEFT OUTER JOIN

sql - 在 T-SQL 中使用条件四舍五入十进制数