我有一张桌子:
be_1 | be_2 | be_3 | ser_name |
---|---|---|---|
11 | 12 | 13 | 名称1 |
22 | 44 | 名称2 | |
55 | 66 | 名称3 | |
77 | 78 | 名称4 | |
11 | 44 | 66 | 名称5 |
有一个用户表:
用户身份 | be_1 | be_2 | be_3 |
---|---|---|---|
1 | 11 | 12 | 13 |
2 | 22 | 44 | |
3 | 22 | 44 | 55 |
4 | 11 | 12 | |
5 | 55 | 66 | |
6 | 13 | 55 | 66 |
7 | 77 | 78 | |
8 | 77 | 22 | 78 |
我想得到这样一张桌子:
用户身份 | ser_name |
---|---|
1 | 名称1 |
2 | 名称2 |
3 | 名称2 |
5 | 名称3 |
6 | 名称3 |
7 | 名称4 |
8 | 名称4 |
例如,user_id = 3 有 name2,因为它有 ser_1 = 22、ser_2 = 44 和 ser_3 = 55、22 和 44 创建 name2
我试过了:
select u.u_id,s.ser_name
from user u
left join service s on (u.ser_1 = s.ser_1 and u.ser_2 = s.ser_2 and u.ser_3 = s.ser_3 )
or (u.ser_1 = s.ser_1 and u.ser_2 = s.ser_2 and (u.ser_3 is null or
s.ser_3 is null))
or (u.ser_1 = s.ser_1 and u.ser_3 = s.ser_3 and (u.ser_2 is null or
s.ser_2 is null))
or (u.ser_2 = s.ser_2 and u.ser_3 = s.ser_3 and (u.ser_1 is null or
s.ser_1 is null))
您想检查来自“用户”( )的各个非空列值是否与服务()表的列值匹配,而无论反向透视(例如,来自的非空列值)是...ser_x
u
s
s
所以,从申请开始u.ser_x = NVL(s.ser_x,u.ser_x) AND u.ser_x IS NOT NULL
。此外,可能会出现双方都为null的情况,然后将OR u.ser_x IS NULL AND s.ser_x IS NULL
每个单独的列相加,并将所有条件组合在一起,AND
因为应该同时满足所有条件。
因此考虑使用以下查询
SELECT u.user_id, s.ser_name
FROM "user" u
JOIN service s
ON (( u.ser_1 = NVL(s.ser_1,u.ser_1) AND u.ser_1 IS NOT NULL) OR u.ser_1 IS NULL AND s.ser_1 IS NULL)
AND (( u.ser_2 = NVL(s.ser_2,u.ser_2) AND u.ser_2 IS NOT NULL) OR u.ser_2 IS NULL AND s.ser_2 IS NULL)
AND (( u.ser_3 = NVL(s.ser_3,u.ser_3) AND u.ser_3 IS NOT NULL) OR u.ser_3 IS NULL AND s.ser_3 IS NULL)
ORDER BY u.user_id;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句