SELECT는 평가 된 마지막 두 번째 절이므로 ORDER BY를 제외하고 별칭을 참조 할 수 없습니다. 두 가지 해결 방법 :
SELECT BalanceDue FROM (
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
) AS x
WHERE BalanceDue > 0;
또는 표현을 반복하십시오.
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) > 0;
나는 후자를 선호합니다. 표현식이 매우 복잡하거나 계산 비용이 많이 드는 경우, 특히 많은 쿼리가이 동일한 표현식을 참조하는 경우 계산 열 (또는 지속)을 고려해야합니다.
추신 : 당신의 두려움은 근거가없는 것 같습니다. 이 간단한 예에서, SQL Server는 계산을 두 번 참조했지만 계산을 한 번만 수행 할 수있을 정도로 똑똑합니다. 계속해서 계획을 비교하십시오. 당신은 그들이 동일한 것을 볼 수 있습니다. 표현식이 여러 번 평가되는 더 복잡한 경우가있는 경우 더 복잡한 쿼리 및 계획을 게시하십시오.
다음은 모두 정확히 동일한 실행 계획을 생성하는 5 가지 예제 쿼리입니다.
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;
다섯 가지 쿼리 모두에 대한 결과 계획 :