Qual é a instrução WITH fazendo neste exemplo? Eu estou tentando gerar aleatoriamente dados

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

Pergunta

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

Solução

A com a sintaxe é o mesmo que usando uma tabela temporária local ou vista em linha. Para meu conhecimento, ele só é suportado no SQL Server (2005 +, chamado Common Table Expressions) e Oracle (9i +, chamado Subquery Factoring). O uso pretendido é para criar uma visão básica que é usada (ou seja: se juntou a). Várias vezes em uma única consulta

Aqui está um exemplo 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 irá retornar resultados idênticos se você usar:

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

O exemplo que você forneceu:

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;

... é um recursiva. Está começando a 1, gerando 999 fileuids no total (que seria 1.000 se tivesse iniciado em 0).

Outras dicas

WITH x AS (...)

Isso levará a saída do ... e tratá-lo como uma tabela chamada x, temporariamente.

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

Esta declaração será, essencialmente, dar-lhe exatamente a mesma coisa que as saídas ... mas em vez disso, ser referenciado como o x tabela

A palavra COM é usado para criar uma expressão de tabela comum (CTE). Neste caso, é a criação de uma tabela embutida que a "escolha fileUID, ..." parte está puxando os dados.

É a criação de CTE (expressão de tabela comum). Esta é uma basicamente uma tabela que você não tem que criar, gota, ou declarar de qualquer maneira. Ele será excluído automaticamente após o lote tem ran.

Confira http://4guysfromrolla.com/webtech/071906-1.shtml para mais informações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top