根据oracle中的列值加入表

Posted

技术标签:

【中文标题】根据oracle中的列值加入表【英文标题】:JOIN Tables based on the column value in oracle 【发布时间】:2020-03-03 09:18:42 【问题描述】:

我正在尝试根据 (A&B)||(C&D) 等列值加入表。我可以分别为 A&B 和 C&D 创建连接。但是我将如何完成两者之间的OR 条件?

[更新] A、B、C 和 D 是 dummy_level 表中的 level_id。 所以加入表格的基本规则是 (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       |
+ --- + ---- + --- + ------- + -------- + ------- + -------- + ------- + -------- + ------- + -------- + ------- +


请帮助解决这个问题。有点残疾,因为我是新手。我非常需要专家来帮助解决这个问题。

【问题讨论】:

能否详细说明实现输出的规则。您在寻找什么 A&B OR C&D 加盟? @LalitKumarB 我已经更新了加入表格的规则 【参考方案1】:

您正在旋转一些值,所以最简单的方法是加入并使用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)

然后您可以进行演示。

【讨论】:

嗨@PonderStibbons,我同意你的观点,但旋转不适合这个用例。假设现在我又添加了两列,INSERT INTO dummy_level VALUES (4,22,'Z'); INSERT INTO dummy_level VALUES (4,24,'Z'); 在这种情况下,加入的条件 [(21 && 22) || (23 && 24)] 不满足,但是上面的查询也会选择新插入的id @ArjunR 。 . .这回答了您提出的问题。如果您有不同的问题,那么您应该接受这个答案并提出一个新问题。

以上是关于根据oracle中的列值加入表的主要内容,如果未能解决你的问题,请参考以下文章

如何根据联接更新 Redshift 中的表列值?

oracle 表列值唯一 怎么实现

MySQL - 根据联接表列值更新列值

MySQL - 根据更新其他表列值触发更新列值

oracle sql查询以获取没有空格的列值

用于检查工作表列值的 Google 脚本