我对SQL有点新意,所以请耐心等待。
我有两个表,每个表都有一个ID列。表A具有标题为角色的列,表B具有标题为结果的列。我想查询这些表以查找哪些基于ID的行具有role =' PS'和结果=' DE'。这是我的代码:
SELECT count(*)
FROM A JOIN B
ON (A.id = B.id
AND A.role = 'PS'
AND B.outcome = 'DE')
我一直在互联网上搜索这样做的方法,以便它不包含具有A.role或B.outcome空值的行。
上面的代码返回假设为40,100,即使B中的条目总数为B.outcome =' DE'只有40,000。因此,显然包括不符合我条件的条目。有没有办法更好地优化我的查询?
答案 0 :(得分:1)
您的查询已排除null
中A.role
值的行。毕竟,null = 'PS'
不是真的,你正在使用内连接。
有一个简单的解释,说明如何从连接中检索更多的行而不是B中的行。假设你有这些行用于A:
A.id A.role
1 'A'
1 'A'
这些行为B:
B.id B.outcome
1 'A'
1 'A'
然后这个查询:
select *
from A
join B
on A.id = B.id and A.role = 'A' and B.role = 'A'
将返回4行。这比表A或B中的更多!
所以我会调查id
是否唯一:
select count(*) from A group by id having count(*) > 1
select count(*) from B group by id having count(*) > 1
如果这些查询返回的计数大于零,则id
不是唯一的。由于连接为每个匹配重复行,这可以解释返回记录数量的大幅增加。