Que fait la déclaration WITH dans cet exemple? J'essaie de générer des données de manière aléatoire

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

Question

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;
Était-ce utile?

La solution

La syntaxe WITH est identique à l’utilisation d’une table temporaire locale ou d’une vue intégrée. À ma connaissance, il n'est pris en charge que par SQL Server (2005+, appelé Common Table Expressions) et Oracle (9i +, appelé Facteur de sous-requête). L’utilisation prévue est de créer une vue de base utilisée (c.-à-d. Jointe à) plusieurs fois dans une même requête.

Voici un exemple typique:

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

... qui retournera des résultats identiques si vous utilisez:

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'exemple que vous avez fourni:

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;

... est une méthode récursive. Il commence à 1 et génère 999 fileuides au total (il serait de 1 000 s'il avait démarré à 0).

Autres conseils

WITH x AS (...)

Ceci prendra la sortie du ... et la traitera comme une table nommée x , temporairement.

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

Cette instruction vous donnera essentiellement la même chose que les sorties ... , mais elle sera référencée comme la table x

Le mot WITH est utilisé pour créer une expression de table commune (CTE). Dans ce cas, vous créez une table en-ligne dans laquelle le "select fileUID, ..." une partie extrait des données de.

Il crée un CTE (Common Table Expression). C'est en gros une table que vous n'avez de toute façon pas à créer, à supprimer ou à déclarer. Il sera automatiquement supprimé une fois le lot exécuté.

Découvrez http://4guysfromrolla.com/webtech/071906-1.shtml pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top