Ich denke, das Hauptproblem ist, dass nicht alle Datenbanken Common Table Expressions unterstützen.
Mein Arbeitgeber nutzt DB / 2 für viele Dinge. Die neuesten Versionen unterstützen CTEs, sodass ich folgende Aufgaben ausführen kann:
with custs as (
select acct# as accountNumber, cfname as firstName, clname as lastName,
from wrdCsts
where -- various criteria
)
, accounts as (
select acct# as accountNumber, crBal as currentBalance
from crzyAcctTbl
)
select firstName, lastName, currentBalance
from custs
inner join accounts on custs.accountNumber = accounts.accountNumber
Das Ergebnis ist, dass wir stark abgekürzte Tabellen- / Feldnamen haben können und ich im Wesentlichen temporäre Ansichten mit besser lesbaren Namen erstelle, die ich dann verwenden kann. Klar, die Abfrage wird länger. Aber das Ergebnis ist, dass ich etwas schreiben kann, das ziemlich klar voneinander getrennt ist (indem ich CTEs so verwende, wie Sie Funktionen verwenden, um DRY zu erhalten) und am Ende gut lesbaren Code erhalte. Und weil ich meine Unterabfragen aufteilen und eine Unterabfrage auf eine andere verweisen kann, ist dies nicht alles "inline". Ich habe gelegentlich einen CTE geschrieben, dann vier andere CTEs, die alle darauf verweisen, und dann hatte die Hauptabfrage Union die Ergebnisse der letzten vier.
Dies kann erfolgen mit:
- DB / 2
- PostGreSQL
- Orakel
- MS SQL Server
- MySQL (neueste Version; noch ein bisschen neu)
- wahrscheinlich andere
Aber es geht einen langen Weg, um den Code sauberer, lesbarer und trockener zu machen.
Ich habe eine "Standardbibliothek" von CTEs entwickelt, die ich in verschiedene Abfragen einbinden kann, um meine neue Abfrage zu starten. Einige von ihnen werden auch von anderen Entwicklern in meiner Organisation angenommen.
Mit der Zeit kann es sinnvoll sein, einige davon in Ansichten umzuwandeln, sodass diese "Standardbibliothek" verfügbar ist, ohne dass Sie kopieren / einfügen müssen. Aber am Ende werden meine CTEs so geringfügig an den verschiedenen Anforderungen angepasst, dass ich keinen einzigen CTE ohne Modifikationen so umfassend einsetzen konnte, dass es sich möglicherweise lohnt, eine Ansicht zu erstellen.
Es scheint, als ob ein Teil Ihrer Beschwerde lautet: "Warum weiß ich nichts über CTEs?" oder "Warum unterstützt meine DB keine CTEs?"
Was Aktualisierungen betrifft ... Ja, Sie können CTEs verwenden, aber meiner Erfahrung nach müssen Sie sie in der set-Klausel UND in der where-Klausel verwenden. Es wäre schön, wenn Sie einen oder mehrere vor der gesamten update-Anweisung definieren könnten und dann nur die "main query" -Teile in den set / where-Klauseln hätten, aber das funktioniert nicht. Und es gibt keinen Grund, obskure Tabellen- / Feldnamen in der Tabelle, die Sie aktualisieren, zu vermeiden.
Sie können CTEs zum Löschen verwenden. Möglicherweise sind mehrere CTEs erforderlich, um die PK / FK-Werte für Datensätze zu ermitteln, die Sie aus dieser Tabelle löschen möchten. Auch hier können Sie nicht vermeiden, dass die Tabellen- / Feldnamen in der Tabelle, die Sie ändern, undeutlich werden.
Soweit Sie eine Auswahl in eine Einfügung vornehmen können, können Sie CTEs für Einfügungen verwenden. Wie immer haben Sie es möglicherweise mit undurchsichtigen Tabellen- / Feldnamen in der Tabelle zu tun, die Sie ändern.
In SQL können Sie NICHT das Äquivalent eines Domänenobjekts erstellen, indem Sie eine Tabelle mit Gettern / Setzern umschließen. Dazu benötigen Sie eine Art ORM sowie eine prozedurale / OO-Programmiersprache. Ich habe solche Dinge in Java / Hibernate geschrieben.