有条件的内部加入Oracle

时间:2015-04-02 08:32:53

标签: database oracle oracle11g inner-join

我遇到有关条件内连接的问题。请看下面的sqlfiddle。

http://sqlfiddle.com/#!4/6dc88

我试图获得所有相同的名字。但如果id是1,那么也得到相同的名称和id为0的名字。你的帮助将是appriciated。谢谢。这是一个例子

Table1 
Id           |            Name
1            |            A
2            |            B
3            |            C

Table2
Id           |            Name
1            |            a
2            |            b
3            |            c
0            |            d

这是我所期待的

A            |            a
B            |            b
C            |            c
A            |            d

编辑:抱歉,我忘记提及我的查询,这是我到目前为止所尝试的内容..

select t1.name, t2.name from table1 t1
inner join table2 t2 on 
CASE
 WHEN t1.id = t2.id_copy and t1.id = 1 THEN 
    0
    else
    t1.id
END = t2.id_copy

提前致谢。

2 个答案:

答案 0 :(得分:3)

假设你的意思是如果table2.id为0,那么它应该与table1.id = 1匹配,那么这应该可以解决问题:

with table1 as (select 1 id, 'A' name from dual union all
                select 2 id, 'B' name from dual union all
                select 3 id, 'C' name from dual),
     table2 as (select 1 id, 'a' name from dual union all
                select 2 id, 'b' name from dual union all
                select 3 id, 'c' name from dual union all
                select 0 id, 'd' name from dual)
select t1.name, t2.name
from   table1 t1
       inner join table2 t2 on (t1.id = case when t2.id = 0 then 1 else t2.id end);

NAME NAME_1
---- ------
A    a     
B    b     
C    c     
A    d     

如果有更复杂的逻辑来决定table2中的不匹配(t1.id = t2.id)行如何与table1匹配,那么你将不得不解释逻辑。

答案 1 :(得分:2)

我个人更喜欢使用更简单的东西,比如:

select t1.name, t2.name from table1 t1
inner join table2 t2
on t1.id = t2.id_copy or (t1.id = 1 and t2.id_copy = 0)