Penso che il problema principale sia che non tutti i database supportano le espressioni comuni delle tabelle.
Il mio datore di lavoro utilizza DB / 2 per molte cose. Le ultime versioni supportano CTE, in modo tale che sono in grado di fare cose come:
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
Il risultato è che possiamo avere nomi di tabelle / campi fortemente abbreviati e sto essenzialmente creando viste temporanee, con nomi più leggibili, che posso quindi usare. Certo, la query si allunga. Ma il risultato è che posso scrivere qualcosa che è abbastanza chiaramente separato (usando CTE nel modo in cui useresti le funzioni per ottenere DRY) e finire con un codice che è abbastanza leggibile. E poiché sono in grado di suddividere le mie subquery e avere un riferimento di subquery a un altro, non è tutto "in linea". Ho, a volte, scritto un CTE, poi ho avuto altri quattro CTE a cui fa riferimento, quindi ho avuto l'unione della query principale con i risultati di questi ultimi quattro.
Questo può essere fatto con:
- DB / 2
- PostGreSQL
- Oracolo
- MS SQL Server
- MySQL (ultima versione; ancora un po 'nuovo)
- probabilmente altri
Ma fa molto per rendere il codice più pulito, più leggibile, più ASCIUTTO.
Ho sviluppato una "libreria standard" di CTE che posso collegare a varie query, iniziandomi in volo con la mia nuova query. Alcuni di loro stanno iniziando ad essere abbracciati anche da altri sviluppatori nella mia organizzazione.
Con il passare del tempo, potrebbe avere senso trasformarne alcune in visualizzazioni, in modo tale che questa "libreria standard" sia disponibile senza la necessità di copiare / incollare. Ma i miei CTE finiscono per essere modificati, anche così leggermente, per varie esigenze che non sono stato in grado di avere un singolo CTE usato così tanto, senza mod, che potrebbe valere la pena creare una vista.
Sembrerebbe che parte della tua lamentela sia "perché non conosco i CTE?" o "perché il mio DB non supporta CTE?"
Per quanto riguarda gli aggiornamenti ... sì, puoi usare i CTE ma, nella mia esperienza, devi usarli all'interno della clausola set AND nella clausola where. Sarebbe bello se potessi definirne una o più prima dell'intera istruzione di aggiornamento e quindi avere solo le parti "query principale" nelle clausole set / where ma non funziona in questo modo. E non è possibile evitare nomi di tabella / campi oscuri sulla tabella che si sta aggiornando.
È possibile utilizzare CTE per le eliminazioni. Potrebbero essere necessari più CTE per determinare i valori PK / FK per i record che si desidera eliminare da quella tabella. Ancora una volta, non puoi evitare nomi di tabella / campo oscuri sulla tabella che stai modificando.
Nella misura in cui è possibile effettuare una selezione in un inserto, è possibile utilizzare CTE per inserti. Come sempre, potresti avere a che fare con nomi di tabella / campi oscuri sulla tabella che stai modificando.
SQL NON consente di creare l'equivalente di un oggetto dominio, avvolgendo una tabella, con getter / setter. Per questo, dovrai usare un ORM di qualche tipo, insieme a un linguaggio di programmazione più procedurale / OO. Ho scritto cose di questo tipo in Java / Hibernate.