根据ID和组合号码加入

Join based on ID and combined number

我有一个像下面这样的 tables 来简单说明我的情况,我选择了 empdept

电磁脉冲:

+----+-------+------+
| ID | Name  | Dept |
+----+-------+------+
| A1 | John  | 0010 |
| A2 | Jack  | 1010 |
| A3 | Jill  | 1100 |
| A4 | James | 0001 |
+----+-------+------+

部门

+---------+------------+
| DEPT_ID | DEPT_NAME  |
+---------+------------+
| 1       | HR         |
| 2       | Audit      |
| 3       | Competency |
| 4       | Manager    |
+---------+------------+

我的预期输出

+----+-------+------------+------+
| ID | Name  | DeptName   | Dept |
+----+-------+------------+------+
| A1 | John  | Competency | 0010 |
| A2 | Jack  | HR         | 1010 |
| A2 | Jack  | Competency | 1010 |
| A3 | Jill  | HR         | 1100 |
| A3 | Jill  | Audit      | 1100 |
| A4 | James | Manager    | 0001 |
+----+-------+------------+------+

逻辑。

我必须根据 emp table 中的 Dept 列从 Department table 中找到 Deptname。它总是 4 位数字,每个数字对应 1 个部门。如果第一位有1就是HR,如果第二位有1就是Audit。如果多个地方都是1,则对应所有部门。我真的不知道为什么要这样设计。我正在努力解决这个问题。

我试过类似下面的方法,但它没有给出所有行。

select * from emp join dept on 1 = substring(dept,dept_id+1,1)

FIDDLE HERE

这是一个糟糕的数据模型,您应该修复它。如果员工可以分配到多个部门,这是错误的处理方式。您应该有一个 table 每个员工和每个分配的部门一行。

就是说,如果您坚持使用此模型,可以使用一些大摆弄:

select *
from emp e join
     dept d
     on convert(int, e.dept) & convert(int, power(2, d.dept_id)) <> 0
order by e.id, d.dept_id;

Here 是一个 db<>fiddle.

注意:这适用于包含四个部门的示例。但是,如果您的部门多于整数中的位,那么这将开始达到其极限(您可以切换到 bigint)。如果这是一个问题,我建议您提出一个新问题。