3

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

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

Users表有两列,AssociatedID and UserType.

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

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

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

4

2 回答 2

8

试试这个:

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 演示

或者:正如@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';

更新的 SQL Fiddle 演示


更新:为此,您必须使用如下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;

使用 CASE 更新了 SQL Fiddle 演示

于 2013-01-09T07:42:05.230 回答
0

相同的 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,'') <>''
于 2015-05-26T16:51:46.787 回答