คุณไม่สามารถอ้างอิงนามแฝงได้ยกเว้นใน ORDER BY เนื่องจาก SELECT เป็นประโยคสุดท้ายที่สองที่ถูกประเมิน การแก้ไขสองวิธี:
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;
ฉันชอบอันหลัง หากการแสดงออกมีความซับซ้อนมาก (หรือมีค่าใช้จ่ายในการคำนวณสูง) คุณควรพิจารณาคอลัมน์ที่คำนวณ (และอาจคงอยู่) แทนโดยเฉพาะอย่างยิ่งหากมีคำถามจำนวนมากอ้างถึงนิพจน์เดียวกันนี้
PS ความกลัวของคุณดูไม่มีมูลความจริง ในตัวอย่างง่ายๆนี้อย่างน้อย 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;
แผนผลลัพธ์สำหรับข้อความค้นหาทั้งห้ารายการ: