Oracle过滤器查询无效

时间:2017-03-11 14:13:26

标签: sql oracle where

我的查询如下 -

Select t1.colmn1, t2.colm1 from table1 t1, table2 t2
where t1.pid = t2.pid
and t1.colm2 is null; --- This query retuns 100 rows
表1中的

pid列有一些空值(比如10个带有pid = null的记录)。 我想修改上面的查询,因为它应该返回这些空值行。 与上述查询中的所有100条记录以及具有pid = null.

的10条记录一样

我试过

Select colmn1 from table1 t1, table2 t2
where t1.pid = t2.pid or t1.pid is null
and t1.colm2 is null;

但是这个查询会返回更多行。

我想要准确的110行。谁能告诉我这里做错了什么?

ANSWER

通过使用以下答案中的所有技巧。以下是可能有助于其他人的最终查询 -

Select colmn1
from table1 t1 left join
     table2 t2
     on t1.pid = t2.pid
where (t1.colm2 is null) or (t2.pid is not null)
and t1.colm2 is null

4 个答案:

答案 0 :(得分:1)

首先,使用正确的,明确的JOIN语法。简单规则:永远不要在FROM子句中使用逗号。

您的问题可以通过括号修复。但最好使用正确的语法:

Select colmn1
from table1 t1 join
     table2 t2
     on t1.pid = t2.pid
where t1.pid is null and t1.colm2 is null;

我明白了。现在问题更清楚了。您似乎想要left join

Select colmn1
from table1 t1 left join
     table2 t2
     on t1.pid = t2.pid
where (t1.colm2 is null) or (t2.pid is not null);

这将返回table1中符合where条件的所有行,即使它们与table2中的条件不匹配。

答案 1 :(得分:0)

运算符优先级使您的查询像这样

...or( t1.pid is null and t1.colm2 is null;)

使用括号或正确的JOIN语法。

答案 2 :(得分:0)

添加到Gordon的答案,你需要OR条件

Select colmn1
from table1 t1 inner join
     table2 t2
     on t1.pid = t2.pid
where t1.pid is null
or t1.colm2 is null;

答案 3 :(得分:0)

试试这个,

Select colmn1 from table1 t1, table2 t2 where t1.pid = t2.pid(+) and t1.colm2 is null;

您无法比较连接上的空值,请调查左,右,外连接,之前的查询表明您希望两个表中的所有记录加上table2上与table1没有对应关系的那些记录。 还要检查下一个。

Select colmn1 from table1 t1, table2 t2 where t1.pid(+) = t2.pid and t1.colm2 is null;