当我在where子句中使用alias时,如果我选择with alias
select * from table1 t1 where t1.id in (select key from (select emp_id key from table2 where emp_id in ('123', '456')))
这和我预期的一样。但如果我选择原始列名
select * from table1 t1 where t1.id in (select emp_id from (select emp_id key from table2 where emp_id in ('123', '456')))
这也是工作!但似乎where条件:'emp_id in(' 123 ',' 456 ')'不生效。
那么这里alias和原始列名有什么区别呢?
2条答案
按热度按时间jutyujz01#
我认为SQL应该是select * from table 1 t1 where t1.id in('123','456');
当您使用where子句筛选同一列时,查询同一列没有任何意义。
fcipmucu2#
您的查询:
被解释为:
并且
emp_id
与外部查询而不是内部查询的内联视图相关。是的,条件
where t2.emp_id in ('123', '456')
似乎没有效果,因为你的查询可以重写为:如果子查询匹配至少一行,则外部查询仅依赖于
table1
。您需要做的是在整个过程中使用表/视图别名,以确保列来自正确的位置:
这应该会失败,并出现一个无效的标识符异常,因为内联视图
v2
没有emp_id
列,并且您希望在最内层的子查询中删除AS key
别名,或者在中间的子查询中使用SELECT v2.key
。Fiddle