我的查询如下 -
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.
我试过
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
答案 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;