Oracle从别名选择VS从原始列选择

agxfikkp  于 2023-06-29  发布在  Oracle
关注(0)|答案(2)|浏览(113)

当我在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和原始列名有什么区别呢?

jutyujz0

jutyujz01#

我认为SQL应该是select * from table 1 t1 where t1.id in('123','456');
当您使用where子句筛选同一列时,查询同一列没有任何意义。

fcipmucu

fcipmucu2#

您的查询:

select *
from   table1 t1
where  t1.id in (
                  select emp_id
                  from   (
                           select emp_id key
                           from   table2
                           where  emp_id in ('123', '456')
                         )
                )

被解释为:

select t1.*
from   table1 t1
where  t1.id in (
                  select t1.emp_id
                  from   (
                           select t2.emp_id AS key
                           from   table2 t2
                           where  t2.emp_id in ('123', '456')
                         ) v2
                )

并且emp_id与外部查询而不是内部查询的内联视图相关。
是的,条件where t2.emp_id in ('123', '456')似乎没有效果,因为你的查询可以重写为:

SELECT t1.*
FROM   table1 t1
WHERE  t1.id = t1.emp_id
AND    EXISTS(
         SELECT 1
         FROM   table2 t2
         WHERE  t2.emp_id IN ('123', '456')
       )

如果子查询匹配至少一行,则外部查询仅依赖于table1
您需要做的是在整个过程中使用表/视图别名,以确保列来自正确的位置:

select t1.*
from   table1 t1
where  t1.id in (
                  select v2.emp_id
                  from   (
                           select t2.emp_id AS key
                           from   table2 t2
                           where  t2.emp_id in ('123', '456')
                         ) v2
                )

这应该会失败,并出现一个无效的标识符异常,因为内联视图v2没有emp_id列,并且您希望在最内层的子查询中删除AS key别名,或者在中间的子查询中使用SELECT v2.key
Fiddle

相关问题