Cosa sta facendo l'istruzione WITH in questo esempio? Sto cercando di generare casualmente dati

StackOverflow https://stackoverflow.com/questions/1413465

Domanda

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;
È stato utile?

Soluzione

La sintassi WITH è uguale all'utilizzo di una tabella temporanea locale o di una vista incorporata. Per quanto ne so, è supportato solo in SQL Server (2005+, chiamato Common Table Expressions) e Oracle (9i +, chiamato Subquery Factoring). L'uso previsto è per la creazione di una vista di base che viene utilizzata (ovvero: unita a) più volte in una singola query.

Ecco un tipico esempio:

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

... che restituirà risultati identici se si utilizza:

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

L'esempio che hai fornito:

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;

... è ricorsivo. Sta iniziando da 1, generando 999 fileuid in totale (sarebbero 1.000 se fosse iniziato a 0).

Altri suggerimenti

WITH x AS (...)

Questo prenderà l'output di ... e lo tratterà temporaneamente come una tabella chiamata x .

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

Questa affermazione essenzialmente ti darà esattamente la stessa cosa degli output ... ma sarà invece indicata come tabella x

La parola WITH viene utilizzata per creare una Common Table Expression (CTE). In questo caso, sta creando una tabella incorporata che " select fileUID, ... " parte sta estraendo i dati da.

Sta creando CTE (Common Table Expression). Questa è sostanzialmente una tabella che non è necessario creare, eliminare o dichiarare in alcun modo. Verrà automaticamente eliminato dopo l'esecuzione del batch.

Scopri http://4guysfromrolla.com/webtech/071906-1.shtml per maggiori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top