2013-03-26 45 views
0

我对面的一个问题来了这里,当我编写一个查询像这样:左联接屈服没有结果

SELECT a.v, b.w, c.x, d.y, e.z 
FROM a 
JOIN b 
on a.id = b.id 
LEFT JOIN c 
on a.id = c.id 
LEFT JOIN d 
on b.code=d.code 
JOIN e 
on a.n = e.n 
WHERE 
a.zone = 10 
WITH (nolock) 

我拿到几百结果,但是当我将它修改为这样:

SELECT a.v, b.w, c.x, d.y, e.z 
FROM a 
JOIN b 
on a.id = b.id 
LEFT JOIN c 
on a.id = c.id AND c.n = 0 
LEFT JOIN d 
on b.code=d.code AND d.n = 0 
JOIN e 
on a.n = e.n 
WHERE 
a.zone = 10 
WITH (nolock) 

我得到零结果。

根据我对SQL和左连接的理解,我觉得使用第一个查询获取任何结果意味着我应该至少获得第二个结果,如果只有一个来自c和d的字段为null。 PROGRESS是否以不寻常的方式实现外部连接?

+1

我认为这是因为'B'不是一个左连接,当你加入'D'到'B'这个效果''a'' – 2013-03-26 15:47:55

回答

0

您可能想知道c.nd.n值是什么。尝试这样的事情来找出你的出发点在哪里。

SELECT c.n, d.n, count(*) 
FROM a 
JOIN b 
on a.id = b.id 
LEFT JOIN c 
on a.id = c.id 
LEFT JOIN d 
on b.code=d.code 
JOIN e 
on a.n = e.n 
WHERE 
a.zone = 10 
group by c.n, d.n 

然后你就可以根据结果调整您的查询

+0

cn,dn和a.zone比较实际上作为参数传递给查询。它在c.n和d.n与数据库中的值匹配时起作用,但左连接的想法是即使它们不这样做也能使其工作。 (它们恰好是描述性表格的关键,并不总是存在) – Sconibulus 2013-03-26 15:57:01

+0

如果输入值,则不是。如果你试图找到他们不匹配的地方,你需要寻找一个不为零的空值。 'c.n是空的' – Lance 2013-03-26 15:59:06