Expression de Table commune dans la Sous-Requête
Je demande de l'aide dans la compréhension de ce qui tous les SGBDR d'Oracle, DB2, Sybase support d'une expression de table commune (CTE) dans une sous-requête. Je suis conscient que PostgreSQL n'a alors que MS SQL Server ne prend pas.
SELECT a.*, b.*
FROM (WHERE aa as (
<<select_query>),
SELECT *
FROM aa
WHERE <<criteria>>
) as a
LEFT JOIN (
WITH bb as (
<<select_query>
),
select * from bb inner join tbl_c on <<innerjoin>> where <<criteria>>
) as b
on <<join_expr>>
Je suis incapable de définir la clause à l'extérieur de la sous-requêtes - à la fois les requêtes sont générées dynamiquement w.r.t. les colonnes, les critères, la sécurité, etc.
Aussi, la requête ci-dessus peut être utilisé dans une autre requête comme une sous-requête.
En résumé, le principe est généré dynamiquement, vues, re-utilisables plus tard. Certaines requêtes peuvent avoir jusqu'à 10-12 ces vues dynamiques être fusionnés ensemble.
Le problème est que l'application est censé être à la base de données agnostique au moins tant que PG, Oracle & DB2 sont concernés et les fonctionnalités non prises en charge par l'un ne sont pas mises en œuvre à tous.
OriginalL'auteur Kapil | 2011-07-25
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez utiliser la CTE est dans les sous-requêtes dans Oracle. À partir de la Oracle 11g docs:
Comme un exemple, cela fonctionne dans Oracle:
OriginalL'auteur DCookie
Qui n'est pas directement la réponse à votre question, mais peut-être que vous pouvez penser à ce sujet:
SQL Server semble à la limite de la sémantique (pas nécessairement la syntaxe) de SQL où il est logique de le faire. Par exemple, vous ne pouvez pas avoir une sous-requête avec un
ORDER BY
clause, si vous n'avez pas également spécifier unTOP n
clause. Cela fait sens, comme l'a ordonné sous-requêtes sont inutiles, sauf si ils ont des limites. D'autres SGBDR permettre une telle inutilité.Dans votre cas (c'est juste une supposition), ayant CTE est dans les sous-requêtes ne fait que rarement de sens, parce que vous pouvez réécrire l'ensemble de votre requête d'une manière qui du CCE sont déclarés au plus haut niveau. La seule différence que vous avez est la portée et peut-être la lisibilité de chaque déclaration.
D'autre part, CTE de permettre des requêtes récursives, ce qui peut être très dur à appliquer lors de la CTE sont déclarées dans les sous-requêtes...
Car vous avez besoin pour mettre en œuvre la base de données agnostique SQL, je vous recommande de ne pas faire un usage intensif de la CTE est encore. Si CTE sont simples, vous pouvez toujours les réécrire comme de simples points de vue...
malheureusement, je ne peux pas vous en dire plus que cela. Je n'ai pas essayé d'utiliser le
WITH
clause dans les requêtes imbriquées encore. Je ne pense pas qu'il devrait être un problème général, cependant, si CTE ne sont pas récursives.OriginalL'auteur Lukas Eder
La plus récente de Microsoft SQL Server versions ne soutien CTE.
OriginalL'auteur user3081814
Alors que PostgreSQL supporte la CTE est, ils sont une optimisation de la barrière qui l'empêche de prédicat ou de rejoindre en poussant sur la CTE de la requête. Cela les rend moins efficaces dans de nombreux cas, qu'un simple sous-requête.
OriginalL'auteur David Aldridge