2010-02-09 91 views
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 = '[email protected]' 
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 = '[email protected]' 
group by e.individual_REf 

返回一行与individual_Ref和0

我不建议SQL被破坏更是我的理解是一个数..所以我想“我的困惑是什么?”是个问题。

+0

+1让人们考虑的效果与JOIN – 2010-02-09 14:06:23

+0

的上下文中的WHERE子句感谢所有答案! – 2010-02-09 14:49:13

回答

1

当子查询转换为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 = '[email protected]' 
GROUP BY 
     e.individual_ref 
+0

我想这很明显,我是自学成才,一点知识是一件危险的事情:-)感谢你的回答 - 现在情况有点清晰了...... – 2010-02-09 14:48:55

3

以下部分使加入以改变:

from email e left join attribute a on e.individual_Ref = a.individual_ref 
where e.email_Address = '[email protected]' 
and a.attr_code_Ref = 4119 

放置一个where子句上已经打开左侧的a.attr_code加入到内连接例如如果不存在任何属性记录,则返回null,这将使where子句失败。 (因为a.attr_code_ref不能4119,没有记录。)

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

+0

更短:isnull(a.attr_code_ref,0)= 4199 – momobo 2010-02-09 13:43:22

+0

明显更短,但我想知道(havnt检查)是否这样做保持它可SARGable或不。应用于被测试领域的函数往往会打破它。 – Andrew 2010-02-09 13:48:55

+1

'= null'永远不会是真的;尝试'空' – Andomar 2010-02-09 13:57:12

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 = '[email protected]' 
and (a.attr_code_Ref = 4119 or a.individual_ref is null) 
group by e.individual_ref 

,你会得到相同的结果

0

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

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

相关问题