为什么第一个查询有效,但不是第二个?使用CASE语句时为什么不识别别名?如何修复第二个查询以使WHERE子句起作用?
SELECT
[a],
[b],
[c],
[d],
[e],
(CASE WHEN (SELECT COUNT(*) FROM Y WHERE Y.a = X.b AND Y.b IS NOT NULL) > 1 then 1 else 0 END) Q
FROM X
--WHERE Q = 1
SELECT
[a],
[b],
[c],
[d],
[e],
(CASE WHEN (SELECT COUNT(*) FROM Y WHERE Y.a = X.b AND Y.b IS NOT NULL) > 1 then 1 else 0 END) Q
FROM X
WHERE Q = 1
第二次查询错误:
Invalid column name 'Q'
答案 0 :(得分:3)
这是正确的行为。如果要在where
子句中使用别名,请使用子查询或CTE:
SELECT X.*
FROM (SELECT [a], [b], [c], [d], [e],
(CASE WHEN (SELECT COUNT(*) FROM Y WHERE Y.a = X.b AND Y.b IS NOT NULL) > 1 then 1 else 0
END) Q
FROM X
) X
WHERE Q = 1;
答案 1 :(得分:0)
除非WHERE
子句中引入了列别名,否则不能在FROM
子句中使用。重复整个表达式或将SELECT
放入CTE,然后使用CTE来使用别名。