oracle 如何在join中获取不重复的行?

a2mppw5e  于 2023-06-05  发布在  Oracle
关注(0)|答案(2)|浏览(486)

我有一些问题与重复的行,我不想得到。
嗨!我有两个表-tab 1和tab 2,我想将tab 2连接到tab 1,如下所示:

SELECT t1.column_A1, t2.column_B2 
FROM tab1 t1
JOIN
tab2 t2
ON t1.column_A1=t2.column_A2

表1

| Column A1 | Column B1 | Column C1 |
|  -------- |  -------- |  -------- |
|  Z1       |  Cell 2   |  Cell 3   |
|  Z2       |  Cell 5   |  Cell 6   |

tab2

| Column A2 | Column B2 | Column C2 |
|  -------- |  -------- |  -------- |
|  Z1       |  PW       |  Cell 3   |
|  Z1       |  RW       |  Cell 6   |

对于tab 1中的某些行,tab 2中有1个以上的行。
结果将是:

| Column A2 | Column B2 | Column C2 |
|  -------- |  -------- |  -------- |
|  Z1       |  PW       |  RE       |
|  Z1       |  RW       |  KS       |

我想得到:如果PW -仅显示一行PW;如果不是PW -仅显示一行RW
结果应为:

| Column A2 | Column B2 | Column C2 |
|  -------- |  -------- |  -------- |
|  Z1       |  PW       |  RE       |
4si2a6ki

4si2a6ki1#

一个选项是按column_b2中存储的值对每个column_a1的行进行“排序”,并返回排名最高的行。
样本数据:

SQL> WITH
  2     tab1 (column_a1, column_b1, column_c1)
  3     AS
  4        (SELECT 'Z1', 'cell 2', 'cell 3' FROM DUAL
  5         UNION ALL
  6         SELECT 'Z2', 'cell 5', 'cell 6' FROM DUAL),
  7     tab2 (column_a2, column_b2, column_c2)
  8     AS
  9        (SELECT 'Z1', 'PW', 'cell 3' FROM DUAL
 10         UNION ALL
 11         SELECT 'Z1', 'RW', 'cell 6' FROM DUAL
 12         UNION ALL
 13         SELECT 'Z2', 'RW', 'cell 8' FROM DUAL),

查询从这里开始:

14     temp
 15     AS
 16        (SELECT t1.column_A1,
 17                t2.column_B2,
 18                ROW_NUMBER () OVER (PARTITION BY t1.column_a1 ORDER BY t2.column_b2) rn
 19           FROM tab1 t1 JOIN tab2 t2 ON t1.column_A1 = t2.column_A2)
 20  SELECT column_a1, column_b2
 21    FROM temp
 22   WHERE rn = 1;

COLUMN_A1    COLUMN_B2
------------ ------------
Z1           PW
Z2           RW

SQL>
whhtz7ly

whhtz7ly2#

这是对没有主键的表的典型任务,即其中存在一些规则如何获取适当的 * 唯一 * 行的复制。
在你的情况下规则是
如果PW -仅显示一行PW;如果不是PW -仅显示一行RW
您可以使用row_number函数实现它,partition by在您的(重复的)键列上,order by实现您的规则(使用decode),以便顺序提供所需的行作为第一行。

示例

select 
   COLUMN_A2, COLUMN_B2, COLUMN_C2,
   row_number() over (partition by COLUMN_A2
                      order by decode (COLUMN_B2,'PW',1,'RW',2,3),COLUMN_B2) as rn 
from tab2;        

CO CO COLUMN         RN
-- -- ------ ----------
Z1 PW cell 3          1
Z1 RW cell 6          2

连接与您使用的相同,只是将rn = 1 predicate 添加到on子句。
请注意,我添加了COLUMN_B2作为列的 * 第二 * 顺序;这是针对两个字符串都不存在的情况,因此使用最小值。
您应该始终使用这样的order by列列表,它们与partition by列一起构成 * 唯一键 *。然后查询提供了一个确定性的结果。

相关问题