Você não pode fazer referência a um alias, exceto em ORDER BY, porque SELECT é a segunda última cláusula avaliada. Duas soluções alternativas:
SELECT BalanceDue FROM (
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
) AS x
WHERE BalanceDue > 0;
Ou apenas repita a expressão:
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) > 0;
Eu prefiro o último. Se a expressão for extremamente complexa (ou dispendiosa de calcular), provavelmente você deve considerar uma coluna computada (e talvez persistente), especialmente se muitas consultas se referirem a essa mesma expressão.
PS seus medos parecem infundados. Neste exemplo simples, pelo menos, o SQL Server é inteligente o suficiente para executar o cálculo apenas uma vez, mesmo que você o tenha mencionado duas vezes. Vá em frente e compare os planos; você verá que são idênticos. Se você tem um caso mais complexo em que vê a expressão avaliada várias vezes, publique a consulta e os planos mais complexos.
Aqui estão 5 exemplos de consultas que produzem exatamente o mesmo plano de execução:
SELECT LEN(name) + column_id AS x
FROM sys.all_columns
WHERE LEN(name) + column_id > 30;
SELECT x FROM (
SELECT LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE x > 30;
SELECT LEN(name) + column_id AS x
FROM sys.all_columns
WHERE column_id + LEN(name) > 30;
SELECT name, column_id, x FROM (
SELECT name, column_id, LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE x > 30;
SELECT name, column_id, x FROM (
SELECT name, column_id, LEN(name) + column_id AS x
FROM sys.all_columns
) AS x
WHERE LEN(name) + column_id > 30;
Plano resultante para todas as cinco consultas:
MERGE
, certifique-se de ter levado tudo isso em consideração:MERGE
com cuidado .Você pode fazer isso usando
cross apply
fonte
Na verdade, é possível definir efetivamente uma variável que pode ser usada nas cláusulas SELECT, WHERE e outras.
Uma junção cruzada não permite necessariamente a ligação apropriada às colunas da tabela referenciada, no entanto OUTER APPLY permite - e trata os nulos de maneira mais transparente.
Muitos elogios para Syed Mehroz Alam .
fonte