Câu hỏi này đã được hỏi vài lần khác, nhưng tôi vẫn không quản lý để sắp xếp ra câu trả lời đúng hoặc đúng cách để làm điều này:Làm thế nào để tổ CTE đúng
...
;WITH CTE AS
(
SELECT * FROM ...
)
SELECT *, [dbo].[udf_BetaInv](A, B, C, D) AS 'Loss'
FROM CTE
WHERE (Loss >= @MinRetention)
này không hoạt động và tôi không thể tạo thủ tục lưu sẵn, rõ ràng là tôi không thể sử dụng Loss trong WHERE vì không tồn tại trong phạm vi đó.
Tôi muốn sử dụng một CTE để quấn một này vì vậy tôi có thể đặt WHERE trên một bên ngoài nhưng không dường như không làm việc, cố gắng này:
;WITH CTE AS
(
SELECT * FROM ...
)
SELECT *, [dbo].[udf_BetaInv(A, B, C, D) AS 'Loss'
FROM CTE,
RESULTS AS
(SELECT * FROM CTE)
SELECT *
FROM RESULTS
WHERE (Loss >= @MinRetention)
Nhưng nó không biên dịch trong SQL Máy chủ, tôi nhận được một lỗi rằng một '(' là sai chỗ nhiều hàng ở trên nhưng không có gì để làm, nếu tôi loại bỏ CTE thứ hai nó hoạt động tốt.
Tôi chỉ muốn tránh trùng lặp mã, không muốn gọi cho tôi [ udf_BetaInv] hai lần trong lựa chọn và cũng ở nơi.
Bạn có nghĩa là '[Mất]' (tên cột) không phải 'Mất' '(một chuỗi) không? Không chắc chắn nếu điều đó gây ra lỗi, mặc dù – Rup