在 ORACLE SQL 中左加入多个条件

凯特

我有一张桌子:

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_xuss

所以,从申请开始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;

Demo

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章