sql-server - T-SQL如何根据值加入多个表
问题描述
所以我有一些复杂的生产表。然而,归根结底,我希望能够根据我正在寻找的价值所在的位置加入多个表。具体来说,假设我有一个员工 ID“JHDOE”,我想将它加入到可以获取该员工姓名的表中。员工的主表是“表 A”:
请注意,字段 ID_2 没有值“JHDOE”。相反,它有“DOEJH”。好吧,还有另一个表实际上具有我正在寻找的价值,“表 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 ......但我不确定。我将非常感谢任何指导或指导。
解决方案
我认为 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)
这是完整的演示。
推荐阅读
- flutter - 更改复制变量的值后,StreamProvider 的值发生意外更改
- java - 为什么最后一行没有被扫描
- python - 从 pandas 列中的字符串列表中删除数字
- lua - 尝试制作硬币计数器,测试时没有任何反应
- reactjs - 使用 dispatch 时 TouchableOpacity 很慢
- javascript - 电子商务产品滑块
- javascript - 对数组进行分组,然后对值求和
- sql - 如何将此查询转换为 typeorm 查询
- angular - 单击单个按钮,以便 Angular 剑道网格详细信息折叠展开
- javascript - VUE:API 轮询在移动设备上不起作用