如何从两个表中选择不同的值限制为一行

时间:2015-02-04 14:43:56

标签: sql oracle

我有两个包含此值的表:

**table 1**    
id name value
1   A     1
2   B     1
3   F     2
4   G     3

**table 2**
id name value
1   C     1
2   D     1
3   E     2

如果我通过值得到这两个表的内连接:

A C
A D
B C
B D
F E

但是,问题是我只希望来自两列的不同值:

A C
B D
F E

另一组可能的结果将是:

A D
B C
F E

表2的名称不会出现在表2中。

如果已经选择了列中的一个值,则无法再次选择它。此示例将是一个错误,因为已经选择了C:

A C
B C
F E

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

为了配对记录,您需要每个值的运行数来链接。为此使用row_number()。

select t1.name as t1_name, t2.name as t2_name
from
(
  select name, value, row_number() over (partition by value order by name) as rn 
  from table1
) t1
join
(
  select name, value, row_number() over (partition by value order by name) as rn
  from table2
) t2
on t1.value = t2.value and t1.rn = t2.rn;

SQL小提琴:http://www.sqlfiddle.com/#!4/75de0/1

答案 1 :(得分:1)

根据您提供的数据以及您用来加入的列,您将获得应该获得的结果。

要获得所需的结果,您需要加入id,而不是value

因此:

select a.id, a.name, b.name
from tableA a
inner join tableB b on a.id = b.id