この例では、WITHステートメントは何をしていますか?ランダムにデータを生成しようとしています
-
06-07-2019 - |
質問
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構文は、ローカル一時テーブルまたはインラインビューを使用する場合と同じです。私の知る限り、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になります)。
他のヒント
WITH x AS (...)
これは、 ...
の出力を取得し、一時的に x
という名前のテーブルとして扱います。
WITH x AS (...)
SELECT * FROM x
このステートメントは、基本的に ...
の出力とまったく同じものを提供しますが、代わりにテーブル x
WITHワードは、共通テーブル式(CTE)を作成するために使用されます。この場合、「select fileUID、...」というインラインテーブルを作成しています。一部がデータをプルしています。
CTE(Common Table Expression)を作成しています。これは基本的に、とにかく作成、削除、宣言する必要のないテーブルです。バッチの実行後に自動的に削除されます。
http://4guysfromrolla.com/webtech/071906-1.shtmlをご覧ください詳細情報。
所属していません StackOverflow