【问题标题】:SQL Four Tables One RecordsetSQL 四表一记录集
【发布时间】:2009-07-27 18:14:54
【问题描述】:

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

我调用 Client 表两次,因为每个客户 ID 都有一个联系号码 = 0 的父级。我需要父级记录来返回城市、州、邮编和公司名称。

我曾尝试使用 recordset.movenext 进行循环,但查询变得非常缓慢,这使得循环变得不可取。

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

当前结果是匹配 Last_Name 查询的记录,并且确实有 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')

【问题讨论】:

    标签: sql join


    【解决方案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)
    

    【讨论】:

    • 非常感谢您的快速回复。在努力整合您的建议时,顺便说一下,这确实为我提供了相当多的见解,Quassnoi 给了我正在寻找的答案。再次感谢您的支持。
    【解决方案2】:
    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%'
    

    【讨论】:

    • 我刚刚哭了。 Quassnoi,您的解决方案非常有效。非常感谢!
    【解决方案3】:

    现在你明白为什么不能把对表的引用放在 where 子句中左连接的右边了吗?原因是把它放在 where 子句中,您将连接转换为内部连接,因为所有记录都必须满足 where 条件。每当您使用左连接时,唯一可以使用并保留连接的引用是您正在查找空记录的地方,然后它会为您提供不在引用表中的其余连接中的记录。

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多