当我有无效的子查询时,为什么此SQL查询有效? -Oracle [重复]

问题描述 投票:0回答:1

此问题已经在这里有了答案:

我在编写查询时犯了一个错误,我试图理解为什么这个查询甚至可以运行。这是查询:

select * from user
where user_id in (select user_id from admin);

在此查询中,user_id表中没有字段admin,但查询仍在运行,最后返回意外结果。 user_id表中有一个user

当我将字段更改为主表中不存在的内容时,查询将不会运行。

select * from user
where user_id in (select test_id from admin);

我还尝试使用不存在的表运行它,该表也没有运行。

select * from user
where user_id in (select user_id from blah);

有人可以解释为什么第一个查询有效吗?有没有更好的方式编写这些查询,从而可以更容易发现错误?

sql oracle subquery
1个回答
0
投票

Always限定您的列引用。您认为第一个查询是:

select u.*
from user u
where u.user_id in (select a.user_id from admin a);

因为a.user_id不存在,它解释为:

select u.*
from user u
where u.user_id in (select u.user_id from admin a);

这正在测试您可能不关心的两件事:

  • u.user_id不为空
  • admin至少有一行
© www.soinside.com 2019 - 2024. All rights reserved.