Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MS SQL中执行此条件联接?_Sql_Sql Server_Tsql_Join - Fatal编程技术网

如何在MS SQL中执行此条件联接?

如何在MS SQL中执行此条件联接?,sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,我到处搜索条件联接,但它们似乎试图做一些与我尝试的不同的事情。为了这个问题,我将把这个问题简化一点 我有三个表:用户、客户和员工。 Users表有两列,AssociatedID和UserType。 UserType是“客户”或“员工”,而关联ID是客户或员工表中的对应ID 问题是,客户机和员工都使用整数作为ID,因此每个表可能有相同的ID用于完全不同的内容(与GUID相反,这样可以避免此问题) 我想要的是一个查询,它将查看Users中的一行,并说如果UserType是Employee,那么在Em

我到处搜索条件联接,但它们似乎试图做一些与我尝试的不同的事情。为了这个问题,我将把这个问题简化一点

我有三个表:
用户、客户和员工。

Users
表有两列,
AssociatedID和UserType。

UserType
“客户”
“员工”
,而
关联ID
是客户或员工表中的对应ID

问题是,客户机和员工都使用整数作为ID,因此每个表可能有相同的ID用于完全不同的内容(与GUID相反,这样可以避免此问题)

我想要的是一个查询,它将查看Users中的一行,并说如果UserType是Employee,那么在Employees表的ID上加入AssociatedID,如果UserType是Client,那么在Clients表的ID上加入AssociatedID。因此,如果客户端和雇员都有一个Name列,我可以得到每个用户的所有名称,不管他们是客户还是员工。我正在使用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';
或:正如@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';
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;

更新:为此,您必须使用以下
大小写表达式:

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';
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;

同样的塞纳里奥:我有CustomerText有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,'') <>''
选择COALESCE(B.CustomerName,C.ShiptName)作为CustomerName
从CustomerExt A
在A.SoldTo=B.CustomerCode上左加入客户B
和isnull(A.ShipTo,,)='
在A.ShipTo=C.ShipToCode上左连接ShipTo C
和isnull(A.ShipTo,“)”

此处的“UNOIN ALL”是否也有效?如果我正确理解COALESCE(),它将返回第一个NOTNULL值。我可以有一个ID为10的客户记录和一个ID为10的员工记录,每个记录都有不同的名称。所以两者都不会返回null,所以我必须根据UserType列的值从两个中选择一个。还是我误解了联合()?