Oracle 中的条件内连接
Conditional Inner Join in Oracle
我有一个关于条件内连接的问题。请看下面的sqlfiddle。
http://sqlfiddle.com/#!4/6dc88
我在这里尝试获取所有相同的名称。但是,如果 id 为 1,则也将获得相同的名称和 id 为 0 的名称。我们将感谢您的帮助。谢谢。这是例子
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
提前致谢。
就我个人而言,我更喜欢使用更简单的东西,例如:
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)
假设你的意思是如果 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
如果关于决定表 2 中的不匹配 (t1.id = t2.id) 行与表 1 匹配的方式有更复杂的逻辑,那么您必须解释该逻辑。
我有一个关于条件内连接的问题。请看下面的sqlfiddle。
http://sqlfiddle.com/#!4/6dc88
我在这里尝试获取所有相同的名称。但是,如果 id 为 1,则也将获得相同的名称和 id 为 0 的名称。我们将感谢您的帮助。谢谢。这是例子
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
提前致谢。
就我个人而言,我更喜欢使用更简单的东西,例如:
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)
假设你的意思是如果 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
如果关于决定表 2 中的不匹配 (t1.id = t2.id) 行与表 1 匹配的方式有更复杂的逻辑,那么您必须解释该逻辑。