web-dev-qa-db-fra.com

Exemple de clause SQL WITH

Duplicate possible:
Différence entre CTE et SubQuery?

J'essayais de comprendre comment utiliser la clause WITH et l'objectif de la clause WITH.

Tout ce que j’ai compris, c’est que la clause WITH remplaçait les sous-requêtes normales.

Quelqu'un peut-il m'expliquer cela avec un petit exemple en détail?

176
user1213167

La clause SQL WITH a été introduite par Oracle dans la base de données Oracle 9i release 2. La clause SQL WITH vous permet de donner un nom à un bloc de sous-requête (processus également appelé refactoring de sous-requête), qui peut être référencé à plusieurs endroits dans la requête SQL principale. Le nom attribué à la sous-requête est traité comme s'il s'agissait d'une vue ou d'une table intégrée. La clause SQL WITH est fondamentalement un remplacement instantané de la sous-requête normale.

Syntaxe de la clause SQL WITH

Voici la syntaxe de la clause SQL WITH lors de l'utilisation d'un alias de sous-requête unique.

WITH <alias_name> AS (sql_subquery_statement)
SELECT column_list FROM <alias_name>[,table_name]
[WHERE <join_condition>]

Lorsque vous utilisez plusieurs alias de sous-requête, la syntaxe est la suivante.

WITH <alias_name_A> AS (sql_subquery_statement),
<alias_name_B> AS(sql_subquery_statement_from_alias_name_A
or sql_subquery_statement )
SELECT <column_list>
FROM <alias_name_A>, <alias_name_B> [,table_names]
[WHERE <join_condition>]

Dans la documentation de syntaxe ci-dessus, les occurrences de alias_name sont un nom explicite que vous donneriez à la sous-requête après la clause AS. Chaque sous-requête doit être séparée par une virgule exemple pour l'instruction WITH . Les autres requêtes suivent les formats standard pour les requêtes SQL SELECT simples et complexes.

Pour plus d'informations: http://www.brighthub.com/internet/web-development/articles/91893.aspx

230
cc4re

Cela a été pleinement répondu ici .

Voir la documentation d'Oracle sur SELECT pour voir comment fonctionne la factorisation de sous-requête et l'exemple de Mark:

WITH employee AS (SELECT * FROM Employees)
SELECT * FROM employee WHERE ID < 20
UNION ALL
SELECT * FROM employee WHERE Sex = 'M'
80
Lorenz Lo Sauer