条件加入oracle

时间:2014-08-01 06:21:51

标签: sql oracle join

有条件加入声明: -

高级别说明: - 如果组合不存在,则基于两列连接表,然后在一个表上连接 -

详细表格

create table tab1
(tab1_col1 number not null,
tab1_col2 number null,
tab1_col3 varchar(10));

查找表

create table lkp1
(lkp_col1 number not null,
lkp_col2 number not null,
lkp_col3 number not null,
lkp_col4 varchar(10));

插入声明 - TAB1

insert into tab1 values (10,101,'A');
insert into tab1 values (12,101,'B');
insert into tab1 values (11,102,'C');
insert into tab1 values (13,103,'B');
insert into tab1 values (14,104,'C');
insert into tab1 values (15,108,'A');
insert into tab1 values (16,102,'D');

查找表 lkp1

insert into lkp1 values (10,101,50,'PICK');
insert into lkp1 values (10,101,50,'PICK');
insert into lkp1 values (11,102,100,'SKIP');
insert into lkp1 values (11,110,50,'PICK');
insert into lkp1 values (13,103,40,'PICK');
insert into lkp1 values (13,103,60,'PICK');
insert into lkp1 values (14,199,100,'PICK');
insert into lkp1 values (15,115,80,'PICK');
insert into lkp1 values (15,115,20,'PICK');

要求 - 基于tab1_col1 = lkp_col1连接表 和 tab1_col2 = lkp_col2 过滤掉查找表数据lkp_col4 = SKIP 如果记录不存在于查找表中,则给出默认值(99.99)。 (应选择tab1表中的所有记录)。

我构建了这个查询,它运行正常。

SELECT tab1_col1, tab1_col2, NVL (lkp_col3, '99.99') "LKP_COL3"
  FROM tab1,
       (SELECT *
          FROM lkp1
         WHERE lkp_col4 = 'PICK') lkp
 WHERE tab1_col1 = lkp_col1(+) AND tab1_col2 = lkp_col2(+)

现在需求已更改 首先检查是否 tab1_col1 = lkp_col1 和 tab1_col2 = lkp_col2 如果查找表没有此组合的数据 然后再次检查 tab1_col1 = lkp_col1 如果这还不可用,那就给出dafault值。

数据库 - Oracle 10g

到目前为止我尝试了什么

经过大量的追踪和错误,我能够得到输出。但是,有没有更好或更简单的方法来使用它?

SELECT tab1_col1, tab1_col2, LKP_COL3
  FROM tab1,
       (SELECT *
          FROM lkp1
         WHERE lkp_col4 = 'PICK') lkp
 WHERE tab1_col1 = lkp_col1 AND tab1_col2 = lkp_col2
 union all
 SELECT tab1_col1, tab1_col2, LKP_COL3
  FROM tab1,
       (SELECT *
          FROM lkp1
         WHERE lkp_col4 = 'PICK') lkp
 WHERE tab1_col1 = lkp_col1(+)
 AND  
 LKP_COL1|| '-' || LKP_COL2 not in( SELECT tab1_col1|| '-' || tab1_col2
  FROM tab1, lkp1 lkp
 WHERE tab1_col1 = lkp_col1 AND tab1_col2 = lkp_col2)
 order by 1

1 个答案:

答案 0 :(得分:1)

以下结果:

| TAB1_COL1 | TAB1_COL2 | LKP_COL3 |
|-----------|-----------|----------|
|        10 |       101 |       50 |
|        11 |       102 |       50 |
|        12 |       101 |    99.99 |
|        13 |       103 |       40 |
|        13 |       103 |       60 |
|        14 |       104 |      100 |
|        15 |       108 |       20 |
|        15 |       108 |       80 |
|        16 |       102 |    99.99 |

是由此查询生成的:

SELECT DISTINCT
      tab1.tab1_col1
    , tab1.tab1_col2
    , COALESCE(lkp1.lkp_col3, lkp2.lkp_col3, 99.99) "LKP_COL3"
FROM tab1
      LEFT JOIN lkp1
                  ON tab1.tab1_col1 = lkp1.lkp_col1
                        AND tab1.tab1_col2 = lkp1.lkp_col2
                        AND lkp1.lkp_col4 = 'PICK'
      LEFT JOIN lkp1 lkp2
                  ON tab1.tab1_col1 = lkp2.lkp_col1
                        AND lkp2.lkp_col4 = 'PICK'
ORDER BY
      tab1.tab1_col1
    , tab1.tab1_col2
;

添加了DISTINCT,因为第二个左(外)连接会在输出中产生不必要的重复。

请参阅此sqlfiddle