2

我对 SQL 有点陌生,所以请耐心等待。

我有两个表,每个表都有一个 ID 列。表 A 有一列标题为角色,表 B 有一列标题为结果。我想查询这些表以查找基于 ID 的哪些行具有角色 = '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。所以它显然包括不符合我条件的条目。有没有办法更好地优化我的查询?

4

1 回答 1

1

您的查询已经排除了具有nullin 值的行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则不是唯一的。由于连接会为每个匹配项重复行,这可以解释返回记录量的大幅增加。

于 2012-07-02T19:33:00.910 回答