Common Table Expression, Sub-Query
Ich würde bitten, für Hilfe zu verstehen, die alle RDBMS von Oracle -, DB2 -, Sybase-Unterstützung (common table expression, CTE), die in einer sub-Abfrage. Ich bin mir bewusst, dass PostgreSQL nicht während der MS SQL Server nicht.
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>>
Ich bin nicht in der Lage zu definieren, die mit der Klausel, die außerhalb der sub-Abfragen - sowohl die Abfragen sind dynamisch generierte w.r.t. die Spalten, die Kriterien, Sicherheit, etc.
Auch die obige Abfrage selbst verwendet werden können, in einer anderen Abfrage als eine sub-Abfrage.
In Zusammenfassung, das Prinzip ist dynamisch generierte Ansichten, re-usable später. Einige Abfragen haben bis zu 10-12 solchen dynamischen Ansichten zusammengeführt werden, wie gut.
Das problem ist, dass die Anwendung sein soll ist Datenbank-agnostisch, zumindest so weit wie PG, Oracle & DB2 betroffen sind und Funktionen, die nicht unterstützt sind, nicht umgesetzt.
- Oracle nennt es "subquery factoring", und es verwenden, um zu definieren, innerhalb einer Unterabfrage erscheint mir als eine schlechte Wahl. Je höher, desto breiter ist der Umfang zu nutzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie können mit CTE ist in Unterabfragen in Oracle. Aus der Oracle 11g-docs:
Als Beispiel funktioniert in Oracle:
Das ist nicht direkt eine Antwort auf deine Frage, aber vielleicht können Sie über diese denken:
SQL Server zu beschränken scheint die Semantik (nicht unbedingt die syntax) von SQL, wo es Sinn macht, dies zu tun. Zum Beispiel können Sie eine Unterabfrage mit einem
ORDER BY
- Klausel, wenn Sie nicht auch angeben, dass einTOP n
- Klausel. Dies macht Sinn, wie bestellt Unterabfragen sind sinnlos, es sei denn, Sie haben Grenzen. Andere RDBMS erlauben für solche Sinnlosigkeit.In deinem Fall (das ist nur eine Vermutung), dass der CTE ist in Unterabfragen macht nur begrenzt Sinn, da schreiben Sie Ihre ganze Abfrage in einer Weise, dass die WAK-s deklariert sind, auf die oberste Ebene. Der einzige Unterschied wird sein, den Rahmen und vielleicht die Lesbarkeit der einzelnen Erklärung.
Auf der anderen Seite, CTE ist damit für rekursive Abfragen, die möglicherweise sehr schwer zu gelten, wenn die CTE ' s deklariert werden, in Unterabfragen...
Da müssen Sie implementieren, Datenbank-agnostisch, SQL, empfehle ich Sie nicht machen starken Gebrauch von CTE noch. Wenn CTE ' s sind einfach, können Sie immer schreiben Sie so einfach sichten...
WITH
Klausel in verschachtelten Abfragen noch. Ich glaube nicht, dass es sollte ein Allgemeines problem, obwohl, wenn CTE ' s sind nicht rekursiv.Neueren Microsoft SQL Server-Versionen unterstützen CTE ist.
Während PostgreSQL unterstützt die WAK-s, Sie sind eine Optimierung Barriere, die verhindert, dass Prädikat oder join drücken in die CTE-Abfrage. Dies macht Sie weniger wirksam in vielen Fällen als eine einfache Unterabfrage.