我有一些问题与重复的行,我不想得到。
嗨!我有两个表-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 |
2条答案
按热度按时间4si2a6ki1#
一个选项是按
column_b2
中存储的值对每个column_a1
的行进行“排序”,并返回排名最高的行。样本数据:
查询从这里开始:
whhtz7ly2#
这是对没有主键的表的典型任务,即其中存在一些规则如何获取适当的 * 唯一 * 行的复制。
在你的情况下规则是
如果PW -仅显示一行PW;如果不是PW -仅显示一行RW
您可以使用row_number函数实现它,
partition by
在您的(重复的)键列上,order by
实现您的规则(使用decode),以便顺序提供所需的行作为第一行。示例
连接与您使用的相同,只是将
rn = 1
predicate 添加到on
子句。请注意,我添加了
COLUMN_B2
作为列的 * 第二 * 顺序;这是针对两个字符串都不存在的情况,因此使用最小值。您应该始终使用这样的
order by
列列表,它们与partition by
列一起构成 * 唯一键 *。然后查询提供了一个确定性的结果。