2

我有三个表(为了争论)个人、电子邮件和属性。individual_Ref 将个人链接到电子邮件和属性的外键。

没有必要在属性表上表示给定的个人,因为他们可能从未添加过属性,并且如果他们有多个属性,他们可能会出现多次。

我想要获取单个引用的列表以及它们的特定属性的计数。但是需要通过电子邮件地址搜索,因为它允许个人共享电子邮件地址(不要让我开始)......

我的第一个刺是

select e.individual_ref, count(a.attr_Code_ref)
from email e left join attribute a on e.individual_Ref = a.individual_ref
where e.email_Address = 'example.email@adomain.net'
and a.attr_code_Ref = 4119 
group by e.individual_ref

使用左连接来确保我从电子邮件中获得个人参考(如果存在),并确保如果电子邮件中有个人参考但属性中没有个人参考,我会得到结果。或者我认为因为这不会返回任何行但是......

select e.individual_ref, 
(select count(a.attr_Code_ref) from attribute a where a.attr_code_Ref = 4119 and a.individual_ref = e.individual_ref)
from email e
where e.email_Address = 'example.email@adomain.net'
group by e.individual_REf

返回一个带有 individual_Ref 且计数为 0 的行

我并不是说 SQL 比我的理解更糟糕……所以我猜“我的困惑是什么?” 是问题。

4

4 回答 4

3

以下部分导致连接改变:

from email e left join attribute a on e.individual_Ref = a.individual_ref 
where e.email_Address = 'example.email@adomain.net' 
and a.attr_code_Ref = 4119  

通过在 a.attr_code 上放置 where 子句,您已将左连接变为内连接,例如,在不存在属性记录的情况下,它返回 null,这会使 where 子句失败。(由于 a.attr_code_ref 不能为 4119,所以没有记录。)

你需要允许a.attr_code_ref = 4199 or a.attr_code_ref is null

于 2010-02-09T13:40:05.287 回答
1

将第一个更改为:

select e.individual_ref, count(a.attr_Code_ref)
from email e left join attribute a on e.individual_Ref = a.individual_ref
where e.email_Address = 'example.email@adomain.net'
and (a.attr_code_Ref = 4119 or a.individual_ref is null)
group by e.individual_ref

你得到相同的结果

于 2010-02-09T13:42:06.043 回答
1

将子查询转换为 a 时,子查询中LEFT JOIN的相关WHERE条件转到联接的ON子句,而不是WHERE子句:

SELECT  e.individual_ref, count(a.attr_Code_ref)
FROM    email e
LEFT JOIN
        attribute a
ON      a.individual_ref = e.individual_Ref
        AND a.attr_code_Ref = 4119 
WHERE   e.email_Address = 'example.email@adomain.net'
GROUP BY
        e.individual_ref
于 2010-02-09T13:53:52.893 回答
0

在第一个查询中,您将连接两个表并查找与您的两个条件相对应的任何行 - 没有。

在第二个查询中,您从第一个表中获取与电子邮件条件相对应的行(有一个),以及从另一个表中获取与您的第二个条件相对应的行数,其中有 0 个。

于 2010-02-09T13:42:36.277 回答