Eu acho que o principal problema é que nem todos os bancos de dados suportam expressões de tabela comuns.
Meu empregador usa o DB / 2 para muitas coisas. As últimas versões suportam CTEs, de modo que eu sou capaz de fazer coisas como:
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
O resultado é que podemos ter nomes de tabelas / campos muito abreviados e estou criando essencialmente exibições temporárias, com nomes mais legíveis, que posso usar. Claro, a consulta fica mais longa. Mas o resultado é que eu posso escrever algo que é claramente separado (usando CTEs da maneira que você usaria funções para ficar SECO) e acabar com um código bastante legível. E como sou capaz de quebrar minhas subconsultas e ter uma subconsulta fazendo referência a outra, nem tudo é "inline". Ocasionalmente, escrevi um CTE, depois tive outros quatro CTEs fazendo referência a ele, depois tive a união de consulta principal os resultados desses quatro últimos.
Isso pode ser feito com:
- DB / 2
- PostGreSQL
- Oráculo
- MS SQL Server
- MySQL (versão mais recente; ainda meio nova)
- provavelmente outros
Mas isso ajuda bastante a tornar o código mais limpo, mais legível e mais SECO.
Eu desenvolvi uma "biblioteca padrão" de CTEs que posso conectar a várias consultas, iniciando rapidamente minha nova consulta. Alguns deles também estão começando a ser adotados por outros desenvolvedores da minha organização.
Com o tempo, pode fazer sentido transformar alguns deles em visualizações, para que esta "biblioteca padrão" esteja disponível sem a necessidade de copiar / colar. Mas meus CTEs acabam sendo aprimorados, ainda que ligeiramente, para várias necessidades que eu não consegui fazer com que um único CTE fosse usado TÃO AMARELO, sem mods, que valeria a pena criar uma visualização.
Parece que parte de sua queixa é "por que eu não sei sobre CTEs?" ou "por que meu banco de dados não suporta CTEs?"
Quanto às atualizações ... sim, você pode usar CTEs, mas, na minha experiência, você deve usá-las dentro da cláusula set E na cláusula where. Seria bom se você pudesse definir um ou mais à frente de toda a instrução de atualização e, em seguida, apenas ter as partes "consulta principal" nas cláusulas set / where, mas não funciona dessa maneira. E não há como evitar nomes obscuros de tabela / campo na tabela que você está atualizando.
Você pode usar CTEs para exclusões. Pode levar vários CTEs para determinar os valores de PK / FK para os registros que você deseja excluir dessa tabela. Novamente, você não pode evitar nomes obscuros de tabela / campo na tabela que está modificando.
Na medida em que você pode fazer uma seleção em uma inserção, você pode usar CTEs para inserções. Como sempre, você pode estar lidando com nomes de tabela / campo obscuros na tabela que está modificando.
O SQL NÃO permite criar o equivalente a um objeto de domínio, agrupando uma tabela com getters / setters. Para isso, você precisará usar algum tipo de ORM, junto com uma linguagem de programação / OO mais procedural. Eu escrevi coisas dessa natureza em Java / Hibernate.