根据ID和组合号码加入
Join based on ID and combined number
我有一个像下面这样的 tables 来简单说明我的情况,我选择了 emp
和 dept
电磁脉冲:
+----+-------+------+
| 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)
这是一个糟糕的数据模型,您应该修复它。如果员工可以分配到多个部门,这是错误的处理方式。您应该有一个 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
)。如果这是一个问题,我建议您提出一个新问题。
我有一个像下面这样的 tables 来简单说明我的情况,我选择了 emp
和 dept
电磁脉冲:
+----+-------+------+
| 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)
这是一个糟糕的数据模型,您应该修复它。如果员工可以分配到多个部门,这是错误的处理方式。您应该有一个 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
)。如果这是一个问题,我建议您提出一个新问题。