2009-07-27 75 views
1

我错过了什么?我需要返回与Last_Name Query相匹配的所有记录,而不管Field_Table中是否有客户编号。SQL四个表一个记录集

我打电话给客户端表两次,因为每个客户端ID都有一个其联系电话号码为0的家长。我需要父记录来返回城市,州,邮编和公司名称。

我试着循环与recordset.movenext但查询变得非常缓慢,这使循环不受欢迎。

如何查询客户表以在客户编号可用时包含客户编号并在缺失时返回?

当前结果是匹配Last_Name查询和DO具有customer_number的记录。我没有得到任何与last_name查询匹配但没有客户编号的记录。

注意:如果公司没有号码,则公司在Field_Table中没有记录。

SELECT A.Contact, 
     A.Id, 
     A.First_Name, 
     A.Last_Name, 
     B.Company_Name, 
     B.City, 
     B.State, 
     FT.Number 
FROM Client C 
    INNER JOIN Client B ON A.Id = B.Id 
    LEFT OUTER JOIN Field_Table FT ON B.Id = FT.Id 
    LEFT OUTER JOIN Field_Definitions FD ON FT.Type_Id = FD.Type_Id 
WHERE (A.Last_Name LIKE '%Last Name%') 
    AND (B.Contact = 0) 
    AND (FD.Description = 'Customer Number') 

回答

1

您需要将FD.Description部分放在ON连接条件中,而不是在WHERE子句中。

SELECT A.Contact, A.Id, A.First_Name, A.Last_Name, B.Company_Name, B.City, B.State, FT.Number 
FROM Client C 
INNER JOIN Client B ON A.Id = B.Id 
LEFT OUTER JOIN Field_Table FT ON B.Id = FT.Id 
LEFT OUTER JOIN Field_Definitions FD ON (FT.Type_Id = FD.Type_Id) AND (FD.Description = 'Customer Number') 
WHERE (A.Last_Name LIKE '%Last Name%') AND (B.Contact = 0) 
+0

非常感谢您的快速回复。在努力合并您的建议时,Quassnoi给我提供了我期待的答案。再次感谢您的支持。 – Jason 2009-07-27 18:36:45

0
SELECT A.Contact, 
     A.Id, 
     A.First_Name, 
     A.Last_Name, 
     B.Company_Name, 
     B.City, 
     B.State, 
     FT.Number 
FROM Client C 
INNER JOIN 
     Client B 
ON  B.Id = A.id 
     AND B.contact = 0 
INNER JOIN 
     Field_Definitions FD 
ON  FD.Description = 'Customer Number' 
LEFT OUTER JOIN 
     Field_Table FT 
ON  FT.Type_Id = FD.Type_Id 
     AND FT.id = B.Id 
WHERE A.Last_Name LIKE '%Last Name%' 
+0

我现在只是哭了。 Quassnoi,你的解决方案非常完美。 非常感谢! – Jason 2009-07-27 18:38:24

0

现在你明白为什么你不能把参考表左侧的右侧加入了where子句中?原因在于将它放入where子句中将联接转换为内部联接,因为where条件必须满足所有记录。任何时候使用左连接时,唯一可以工作并保留连接的引用是您正在查找空记录的那个空记录,然后将其中的其他连接的记录提供给不在引用表中的记录。

相关问题