¿Qué está haciendo la instrucción WITH en este ejemplo? Estoy tratando de generar datos al azar

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

Pregunta

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;
¿Fue útil?

Solución

La sintaxis WITH es igual que usar una tabla temporal local o una vista en línea. Que yo sepa, solo es compatible con SQL Server (2005+, llamado Common Table Expressions) y Oracle (9i +, llamado Subquery Factoring). El uso previsto es para crear una vista básica que se usa (es decir, se une a) varias veces en una sola consulta.

Aquí hay un ejemplo típico:

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

... que devolverá resultados idénticos si usa:

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

El ejemplo que proporcionó:

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;

... es recursivo. Está comenzando en 1, generando 999 fileuids en total (serían 1,000 si hubiera comenzado en 0).

Otros consejos

WITH x AS (...)

Esto tomará la salida de ... y la tratará como una tabla llamada x , temporalmente.

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

Esta declaración esencialmente le dará exactamente lo mismo que las salidas ... pero en su lugar se hará referencia a ella como la tabla x

La palabra WITH se usa para crear una expresión de tabla común (CTE). En este caso, está creando una tabla en línea en la que " seleccione fileUID, ... " parte está extrayendo datos.

Está creando CTE (expresión de tabla común). Esta es básicamente una tabla que no tiene que crear, descartar o declarar de todos modos. Se eliminará automáticamente después de que se haya ejecutado el lote.

Vea http://4guysfromrolla.com/webtech/071906-1.shtml para más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top