SQL四个表一个记录集

时间:2009-07-27 18:14:55

标签: sql join

我错过了什么?我需要返回与Last_Name查询匹配的所有记录,无论它们是否在Field_Table中有客户编号。

我正在调用Client表两次,因为每个客户端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')

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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%'

答案 2 :(得分:0)

现在你明白为什么你不能把引用放在where子句的左连接右边的表中?原因是将它放在where子句中,将连接转换为内连接,因为所有记录必须满足where条件。无论何时使用左连接,对它的唯一引用都将起作用并保留连接,这是一个您正在寻找空记录的位置,然后它会为您提供其他不在引用表中的连接中的记录。