cos*_*ost 2 sql t-sql sql-server join
我四处寻找有条件的连接,但似乎他们正试图做一些与我正在尝试的不同的事情.我会针对这个问题简化一下这个问题.
我有三张桌子: Users, Clients, and Employees.
该Users表有两列,AssociatedID and UserType.
UserType或者是"Client"或"Employee,"并且AssociatedID是在客户端或者雇员表的相应的ID.
问题是,客户端和员工都使用ID的整数,因此每个表可以具有完全不同的ID相同的ID(与GUID相反,这将避免此问题).
我想要的是一个查询,它将查看Users中的一行,并说明UserType是否为Employee,然后是Employees表的ID上的JOIN AssociatedID,如果UserType是Client,则在Clients表的ID上加入AssocaitedID.因此,如果客户端和员工都有一个名称列,我可以获得每个用户的所有名称,无论他们是客户还是员工.我正在使用SQL Server 2008 R2,如果这在这里有所作为.
试试这个:
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';
Run Code Online (Sandbox Code Playgroud)
或者:正如@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';
Run Code Online (Sandbox Code Playgroud)
更新:为此你必须使用这样的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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2828 次 |
| 最近记录: |