5
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

4 に答える 4

16

WITH構文は、ローカル一時テーブルまたはインラインビューを使用する場合と同じです。私の知る限り、これはSQL Server(2005+、Common Table Expressionsと呼ばれる)とOracle(9i +、Subquery Factoringと呼ばれる)でのみサポートされています。使用目的は、1つのクエリで複数回使用される(つまり、結合される)基本ビューを作成することです。

典型的な例を次に示します。

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(Common Table Expression)を作成しています。これは基本的に、作成、削除、または宣言する必要のないテーブルです。バッチが実行されると、自動的に削除されます。

詳細については、http: //4guysfromrolla.com/webtech/071906-1.shtmlをご覧ください。

于 2009-09-11T21:58:53.373 に答える