JOIN表基于oracle中的列值
JOIN Tables based on the column value in oracle
我正在尝试根据 (A&B)||(C&D)
等列值加入 table。我可以分别为 A&B 和 C&D 创建连接。但是我将如何完成两者之间的 OR
条件?
[更新]
A、B、C、D是dummy_leveltable中的level_ids。
所以加入 table 的基本规则是 (21 && 22) || (23 && 24)
我的table结构是,
CREATE TABLE dummy_cust(
id INT,
NAME VARCHAR(50),
age INT,
country VARCHAR(50));
INSERT INTO dummy_cust VALUES (1,'KIM',23,'US');
INSERT INTO dummy_cust VALUES (2,'KOM',24,'US');
INSERT INTO dummy_cust VALUES (3,'KING',29,'US');
INSERT INTO dummy_cust VALUES (4,'RAM',29,'US');
INSERT INTO dummy_cust VALUES (5,'RAV',23,'US');
INSERT INTO dummy_cust VALUES (6,'KIV',25,'US');
CREATE TABLE dummy_level(
id INT,
level_id INT,
STATUS VARCHAR(50));
INSERT INTO dummy_level VALUES (1,21,'C');
INSERT INTO dummy_level VALUES (1,22,'C');
INSERT INTO dummy_level VALUES (1,24,'C');
INSERT INTO dummy_level VALUES (2,22,'C');
INSERT INTO dummy_level VALUES (2,23,'C');
INSERT INTO dummy_level VALUES (2,24,'C');
INSERT INTO dummy_level VALUES (3,21,'Z');
INSERT INTO dummy_level VALUES (3,22,'Z');
INSERT INTO dummy_level VALUES (4,21,'Z');
INSERT INTO dummy_level VALUES (4,22,'Z');
INSERT INTO dummy_level VALUES (4,24,'Z');
预期结果:
+ --- + ---- + --- + ------- + -------- + ------- + -------- + ------- + -------- + ------- + -------- + ------- +
| id | name | age | country | Level ID | Status | Level ID | Status | Level ID | Status | Level ID | Status |
+ --- + ---- + --- + ------- + -------- + ------- + -------- + ------- + -------- + ------- + -------- + ------- +
| 1 | KIM | 23 | US | 21 | C | 22 | C | | | 24 | C |
| 2 | KOM | 24 | US | | | 22 | C | 23 | C | 24 | C |
| 3 | KING | 29 | US | 21 | Z | 22 | Z | | | | |
| 4 | RAM | 29 | US | 21 | Z | 22 | Z | | | 24 | Z |
+ --- + ---- + --- + ------- + -------- + ------- + -------- + ------- + -------- + ------- + -------- + ------- +
请帮助解决这个问题。因为我是新来的,所以有点残疾。我非常需要专家来帮助解决这个问题。
您正在旋转一些值,最简单的方法是加入并使用 pivot
:
select *
from dummy_cust c
join dummy_level l using (id)
pivot (max(level_id) lvl, max(status) sts
for level_id in (21 as l21, 22 as l22, 23 as l23, 24 as l24) )
order by id
如果我对您的评论理解正确,您希望显示同时具有级别 21 和 22 或级别 23 和 24 的行。因此:
select *
from (
select c.id, c.name, c.age, c.country, l.level_id, l.status,
count(case level_id when 21 then 1 end) over (partition by c.id) c21,
count(case level_id when 22 then 1 end) over (partition by c.id) c22,
count(case level_id when 23 then 1 end) over (partition by c.id) c23,
count(case level_id when 24 then 1 end) over (partition by c.id) c24
from dummy_cust c
join dummy_level l on c.id = l.id )
where (c21 > 0 and c22 > 0) or (c23 > 0 and c24 > 0)
然后你就可以做pivot来展示了。
我正在尝试根据 (A&B)||(C&D)
等列值加入 table。我可以分别为 A&B 和 C&D 创建连接。但是我将如何完成两者之间的 OR
条件?
[更新] A、B、C、D是dummy_leveltable中的level_ids。 所以加入 table 的基本规则是 (21 && 22) || (23 && 24)
我的table结构是,
CREATE TABLE dummy_cust(
id INT,
NAME VARCHAR(50),
age INT,
country VARCHAR(50));
INSERT INTO dummy_cust VALUES (1,'KIM',23,'US');
INSERT INTO dummy_cust VALUES (2,'KOM',24,'US');
INSERT INTO dummy_cust VALUES (3,'KING',29,'US');
INSERT INTO dummy_cust VALUES (4,'RAM',29,'US');
INSERT INTO dummy_cust VALUES (5,'RAV',23,'US');
INSERT INTO dummy_cust VALUES (6,'KIV',25,'US');
CREATE TABLE dummy_level(
id INT,
level_id INT,
STATUS VARCHAR(50));
INSERT INTO dummy_level VALUES (1,21,'C');
INSERT INTO dummy_level VALUES (1,22,'C');
INSERT INTO dummy_level VALUES (1,24,'C');
INSERT INTO dummy_level VALUES (2,22,'C');
INSERT INTO dummy_level VALUES (2,23,'C');
INSERT INTO dummy_level VALUES (2,24,'C');
INSERT INTO dummy_level VALUES (3,21,'Z');
INSERT INTO dummy_level VALUES (3,22,'Z');
INSERT INTO dummy_level VALUES (4,21,'Z');
INSERT INTO dummy_level VALUES (4,22,'Z');
INSERT INTO dummy_level VALUES (4,24,'Z');
预期结果:
+ --- + ---- + --- + ------- + -------- + ------- + -------- + ------- + -------- + ------- + -------- + ------- +
| id | name | age | country | Level ID | Status | Level ID | Status | Level ID | Status | Level ID | Status |
+ --- + ---- + --- + ------- + -------- + ------- + -------- + ------- + -------- + ------- + -------- + ------- +
| 1 | KIM | 23 | US | 21 | C | 22 | C | | | 24 | C |
| 2 | KOM | 24 | US | | | 22 | C | 23 | C | 24 | C |
| 3 | KING | 29 | US | 21 | Z | 22 | Z | | | | |
| 4 | RAM | 29 | US | 21 | Z | 22 | Z | | | 24 | Z |
+ --- + ---- + --- + ------- + -------- + ------- + -------- + ------- + -------- + ------- + -------- + ------- +
请帮助解决这个问题。因为我是新来的,所以有点残疾。我非常需要专家来帮助解决这个问题。
您正在旋转一些值,最简单的方法是加入并使用 pivot
:
select *
from dummy_cust c
join dummy_level l using (id)
pivot (max(level_id) lvl, max(status) sts
for level_id in (21 as l21, 22 as l22, 23 as l23, 24 as l24) )
order by id
如果我对您的评论理解正确,您希望显示同时具有级别 21 和 22 或级别 23 和 24 的行。因此:
select *
from (
select c.id, c.name, c.age, c.country, l.level_id, l.status,
count(case level_id when 21 then 1 end) over (partition by c.id) c21,
count(case level_id when 22 then 1 end) over (partition by c.id) c22,
count(case level_id when 23 then 1 end) over (partition by c.id) c23,
count(case level_id when 24 then 1 end) over (partition by c.id) c24
from dummy_cust c
join dummy_level l on c.id = l.id )
where (c21 > 0 and c22 > 0) or (c23 > 0 and c24 > 0)
然后你就可以做pivot来展示了。