【问题标题】:How would I do this conditional join in MS SQL?我将如何在 MS SQL 中执行此条件连接?
【发布时间】:2012-12-23 05:07:14
【问题描述】:

我四处寻找条件连接,但似乎他们正在尝试做一些与我正在尝试不同的事情。对于这个问题,我会稍微简化一下问题。

我有三张桌子:Users, Clients, and Employees.

Users 表有两列,AssociatedID and UserType.

UserType"Client""Employee,"AssociatedID 是 Clients 或 Employees 表中的对应 ID。

问题是,Clients 和Employees 都使用整数作为ID,所以每个表可以有相同的ID 来表示完全不同的东西(而不是GUID,这可以避免这个问题)。

我想要的是一个查询,它将查看 Users 中的一行,并说明 UserType 是否为 Employee,然后在 Employees 表的 ID 上加入 AssociatedID,如果 UserType 是 Client,然后在 Clients 表的 ID 上加入 AssocaitedID。因此,如果客户和员工都有一个名称列,我可以获得每个用户的所有名称,无论他们是客户还是员工。我正在使用 SQL Server 2008 R2,如果这在这里有所不同的话。

【问题讨论】:

    标签: sql sql-server tsql join


    【解决方案1】:

    试试这个:

    SELECT 
      COALESCE(c.Name, e.Name) AssociatedName,
      ... 
    FROM Users u
    LEFT JOIN Clients c    ON u.AssociatedID = c.ClientId
                          AND u.UserType     = 'Client'
    LEFT JOIN Employees e  ON u.AssociatedID = e.EmployeeId
                          AND u.UserType     = 'Employee';
    

    SQL Fiddle demo

    或者:正如@Tikkes 指出的那样,您可以像这样使用UNION 执行此操作:

    SELECT c.Name AssociatedName
    FROM Users u
    INNER JOIN Clients c    ON u.AssociatedID = c.ClientId
                          AND u.UserType     = 'Client'
    UNION ALL
    SELECT e.Name FROM Users u
    INNER JOIN Employees e  ON u.AssociatedID = e.EmployeeId
                          AND u.UserType     = 'Employee';
    

    Updated SQL Fiddle Demo


    更新:为此,您必须像这样使用CASE 表达式:

    SELECT 
      u.AssociatedID,
      CASE u.UserType 
       WHEN 'Client' THEN c.Name
       ELSE e.Name 
      END AS AssociationName
    FROM Users u
    LEFT JOIN Clients c    ON u.AssociatedID = c.ClientId      
    LEFT JOIN Employees e  ON u.AssociatedID = e.EmployeeId;
    

    Updated SQL Fiddle Demo using CASE

    【讨论】:

    • “UNOIN ALL”在这里也有效吗?还是最终会出现问题?
    • 如果我理解 COALESCE() 正确,它返回第一个不为空的东西。我可以有一个 ID 为 10 的客户记录和一个 ID 为 10 的员工记录,每个记录都有不同的名称。所以两者都不会返回 null,所以我必须根据 UserType 列的值选择两者之一。还是我误解了 COALESCE()?
    【解决方案2】:

    Senario:我有 CustomerExt 有 SoldTo 和 ShipTo 代码, 如果 ShipTo 列有值,则在表 ShipTo 中使用 ShipToName,否则在 Customer 表中使用 CustomerName

    Select COALESCE(B.CustomerName, C.ShiptoName) as CustomerName  
    FROM CustomerExt A
    
    left join Customer B    ON A.SoldTo = B.CustomerCode
                          AND isnull(A.ShipTo,'') =''
    
    left join ShipTo C  ON A.ShipTo = C.ShipToCode
                          AND isnull(A.ShipTo,'') <>''
    

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 2012-03-21
      • 2011-05-06
      • 2010-10-12
      • 1970-01-01
      • 2016-07-22
      • 2013-07-23
      • 2010-10-26
      • 1970-01-01
      相关资源
      最近更新 更多