有条件地加入甲骨文 [英] conditional joining in oracle

查看:120
本文介绍了有条件地加入甲骨文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有条件的加入声明:-

高级描述:- 如果不存在组合,则基于两列联接表,然后联接一张表-

High level Description :- Join table based on two columns if combination is not present then join on one table -

详细表格-

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

Lookup Table 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表中的所有记录).

Requirement was - Join table based on tab1_col1=lkp_col1 and tab1_col2=lkp_col2 Filter out lookup table data lkp_col4=SKIP If record not present in lookup table for then give default value(99.99). (All records from tab1 table should be selected).

我建立了这个查询,它运行正常.

I built this query and it was working fine.

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值.

Now requirement changed First check if tab1_col1=lkp_col1 and tab1_col2=lkp_col2 If lookup table is not having data for this combination then check again with tab1_col1=lkp_col1 If this is not also available then give dafault value.

数据库-Oracle 10g

Database - Oracle 10g

到目前为止我尝试过的事情

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

After lot of trail and error I m able to get the output. However, is there a better or simple way to use this ?

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

推荐答案

以下结果:

| 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,因为第二个左(外)连接在输出中产生了不必要的重复.

DISTINCT was added because the second left (outer) join produces unwanted repetition in the output.

请参阅此 sqlfiddle

这篇关于有条件地加入甲骨文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆