Anda tidak dapat mereferensikan alias kecuali dalam ORDER BY karena SELECT adalah klausa terakhir kedua yang dievaluasi. Dua solusi:
SELECT BalanceDue FROM (
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
) AS x
WHERE BalanceDue > 0;
Atau ulangi saja ungkapan:
SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue
FROM Invoices
WHERE (InvoiceTotal - PaymentTotal - CreditTotal) > 0;
Saya lebih suka yang terakhir. Jika ekspresi sangat rumit (atau mahal untuk dihitung), Anda mungkin harus mempertimbangkan kolom yang dihitung (dan mungkin bertahan) sebagai gantinya, terutama jika banyak pertanyaan merujuk ke ekspresi yang sama ini.
PS Ketakutan Anda tampaknya tidak berdasar. Setidaknya dalam contoh sederhana ini, SQL Server cukup pintar untuk hanya melakukan perhitungan satu kali, meskipun Anda telah merujuknya dua kali. Silakan membandingkan rencana; Anda akan melihat mereka identik. Jika Anda memiliki kasus yang lebih kompleks di mana Anda melihat ekspresi dievaluasi beberapa kali, silakan kirim kueri yang lebih kompleks dan paket.
Berikut adalah 5 contoh kueri yang semuanya menghasilkan rencana eksekusi yang sama persis:
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;
Rencana hasil untuk semua lima pertanyaan:
MERGE
, pastikan Anda telah memperhitungkan semua ini:MERGE
dengan hati-hati .Anda dapat melakukan ini menggunakan
cross apply
sumber
Sebenarnya mungkin untuk secara efektif mendefinisikan variabel yang dapat digunakan dalam klausa SELECT, WHERE dan lainnya.
Penggabungan silang tidak selalu memungkinkan pengikatan yang sesuai dengan kolom tabel yang direferensikan, namun OUTER BERLAKU melakukannya - dan memperlakukan null secara lebih transparan.
Kudos to Syed Mehroz Alam .
sumber