首页 > 解决方案 > T-SQL如何根据值加入多个表

问题描述

所以我有一些复杂的生产表。然而,归根结底,我希望能够根据我正在寻找的价值所在的位置加入多个表。具体来说,假设我有一个员工 ID“JHDOE”,我想将它加入到可以获取该员工姓名的表中。员工的主表是“表 A”: 表 A

请注意,字段 ID_2 没有值“JHDOE”。相反,它有“DOEJH”。好吧,还有另一个表实际上具有我正在寻找的价值,“表 B”:

表 B

在这张表中,我们确实看到了“JHDOE”,所以起初我尝试了这样的事情:

from TableStart as start
left join TableB as b on
            case
                when start.EMP_ID like '[0-9]%'
                then b.ID
                else b.ID_2
            end = start.EMP_ID

但这产生了其他问题。所以我想做的是加入任何一个表,或者至少达到相同的效果。我尝试的一种方法是:

from TableStart as start
left join (select a.Name, a.ID, a.ID_2
           from TableA as a
           union
           select b.Name, b.ID, b.ID_2
           from TableB as b) names on
            case
                when start.EMP_ID like '[0-9]%'
                then names.ID
                else names.ID_2
            end = start.EMP_ID

联合的结果集如下所示:

联合结果集

在我的生产数据上,同样的情况导致了空白。我想它不知道要加入哪一行?所以我想我需要做一些事情,比如将行转成列,然后做一个 OR ......但我不确定。我将非常感谢任何指导或指导。

标签: sql-servertsqlleft-join

解决方案


我认为 IN 运算符可以工作,而不是在连接中使用 CASE。这将用作 OR(EMP_ID = ID 或 EMP_ID = ID_2)。如果您从 TableStart LEFT JOIN 到 TableA 和 TableB 并对 TableA 和 TableB 中的每一列使用 COALESCE 函数,您将获得第一个非空值。

这假设如果 TableA 和 TableB 都与 TableStart 匹配,那么您可以接受第一个非空值,如果 TableA 有一些空值,这可能会导致来自 TableA 和 TableB 的值混合。

select 
  start.*
, coalesce (a.Name, b.Name) as [Name]
, coalesce (a.ID, b.ID)     as [ID]
, coalesce (a.ID_2, b.ID_2) as [ID_2]
from TableStart as start
left join TableA as a on start.EMP_ID in (a.ID, a.ID_2)
left join TableB as b on start.EMP_ID in (b.ID, b.ID_2)

这是完整的演示


推荐阅读