【问题标题】:Join query from table with multiple foreign keys to same table primary key将具有多个外键的表的查询连接到同一个表的主键
【发布时间】:2009-09-13 11:39:01
【问题描述】:

我有一个使用 SQL Express 2008 的工作订单系统。我有一个名为 Workorders 的表,其中有几个通过 UserID 链接到它的人员。在 Workorder 表中,我有 TechID 用于技术员,CustomerID 用于客户,QAID 用于质量保证。这些通过 UserID(用户表 PK)链接回用户表。我想加入这些表以从用户表中返回技术人员姓名、客户姓名和 QA 姓名,以及从工单表中返回其他工作信息信息。我不知道如何构建连接。

【问题讨论】:

    标签: sql join


    【解决方案1】:

    有点像这样的东西怎么样:

    select tech.name as tech_name,
        customer.name as customer_name,
        qa.name as qa_name
    from Workorders
        inner join User as tech on tech.userId = Workorders.techId
        inner join User as customer on customer.useId = Workorders.CustomerId
        inner join User as qa on qa.useId = Workorders.QAID
    

    (可能需要一些调整,但想法应该在这里)

    也就是说,你是:

    • 从工单开始
    • 内部加入其技术人员(用户),
    • 然后在其客户(另一个用户)上进行内部连接
    • 等等

    这允许您在 select 子句中使用正确的别名来获取每个名称。
    请注意,我在 select 子句中也使用了别名——使用“worker_name”和“tech_name”可能很有用,而不是只有两个列名称“name”——尤其是当您从其他人调用此查询时编程语言。

    注意:如果其中一个 userId 字段可以为 NULL,您可能希望使用左连接,而不是内连接。

    【讨论】:

    • 您的意思是在所有联接中使用相同的表名吗?
    • 不是真的 :-( 至少不是“工作订单”——我已经编辑过,为每个用户使用用户表...
    【解决方案2】:
    select tus.Name as 'TechnicianName',
           cus.Name as 'CustomerName',
           qus.Name as 'QaName',
           wod.*
      from WorkOrders wod
             left outer join
           Users      tus on tus.UserId = wod.TechId
             left outer join
           Users      cus on cus.UserId = wod.CustomerId
             left outer join
           Users      qus on qus.UserId = wod.QaId
    

    【讨论】:

    • 您的 select 子句有点粗略,应该更像:选择 tus.Name 作为 TechnicianName, cus.Name 作为 CustomerName 等等。
    • 匆忙编写 SQL 时会出现这种情况...已修复,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多