JOIN Таблицы на основе значения столбца в oracle - PullRequest
2 голосов
/ 03 марта 2020

Я пытаюсь присоединиться к таблице на основе значений столбцов, таких как (A&B)||(C&D). Я могу создать соединение для A & B и C & D отдельно. Но как мне выполнить sh условие OR между ними?

[ОБНОВЛЕНИЕ] A, B, C и D - это level_ids в таблице dummy_level. Таким образом, основное правило для присоединения к таблице (21 && 22) || (23 && 24)

Моя структура таблицы:


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       |
+ --- + ---- + --- + ------- + -------- + ------- + -------- + ------- + -------- + ------- + -------- + ------- +


Пожалуйста, помогите решить эту проблему. Немного инвалидов, поскольку я новичок в этом. Мне очень нужны эксперты, чтобы помочь здесь в решении этого.

1 Ответ

1 голос
/ 03 марта 2020

Вы поворачиваете некоторые значения, поэтому проще всего присоединиться и использовать 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         

dbfiddle demo

Если я правильно понимаю ваш комментарий, вы хотите показать строки, когда они имеют оба уровня 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)

Тогда вы можете сделать сводку для презентации .

...