首页 > 解决方案 > Over Partition 以查找重复项并根据条件 SQL 删除它们

问题描述

我希望每个人都做得很好。我有一个我无法弄清楚的两难境地。我正在尝试为不重复的字段找到唯一值。

例如:

表格1

|Col1  | Col2| Col3 |     
| 123  |  A  |  1   |     
| 123  |  A  |  2   |     
|  12  |  B  |  1   |     
|  12  |  B  |  2   |     
|  12  |  C  |  3   |     
|  12  |  D  |  4   |     
|  1   |  A  |  1   |     
|  2   |  D  |  1   |      
|  3   |  D  |  1   |  

Col 1 是具有重复值的字段。Col2 将是 Col 1 中值的所有者。 Col 3 使用 row number() Over Partition 语法以升序获取数字。

我试图完成的目标是删除 col 1 中的值,如果它在查看 col2 时不是真正唯一的。

例子:

Col1 的值为 123,Col2 的值为 A。虽然有两个 123 由 A 拥有的实例,但我可以确定它确实是唯一的。

现在看看 Col1 的值为 12,Col2 的值为 B、C、D。

值 12 与三个不同的所有者相关联,因此从我们的结果列表中删除了 12。

所以最后我想看到一个这样的结果表:

|Col1  | Col2| 
| 123  |  A  | 
|  1   |  A  |
|  2   |  D  | 
|  3   |  D  |

总而言之,我想首先使用分区号来识别 col1 中的值是否重复。从那里我想验证 col 2 中的值是否相同。如果是这样,col 1 和 col 2 中的值将保留为一个条目。但是,如果 col 2 中的值不匹配,则会删除 col1 值的所有记录。

如果需要,我将为我的查询提供语法代码。

更新**

我没有提到表 1 是内部连接两个表的结果。

所以 Col1 来自表 a,Col2 来自表 b。

表 a 中 col2 的值很难解释,所以我必须理解它们并为其分配正确的名称值。

我用来结合两者的连接查询是:

Select a.Col1, B.Col2 FROM Table a INNER JOIN Table b on a.Colx = b.Colx

更新**

表一:

|Col1  | Colx| Col3 |     
| 123  | SMS |  1   |     
| 123  | S9W |  2   |     
|  12  | NAV |  1   |     
|  12  | NFR |  2   |     
|  12  | ABC |  3   |     
|  12  | DEF |  4   |     
|  1   | SMS |  1   |     
|  2   | DEF |  1   |      
|  3   | DES |  1   |  

表 b:

|Colx  | Col2| 
| SMS  |  A  | 
| S9W  |  A  |
| DEF  |  D  | 
| DES  |  D  |
| NAV  |  B  |
| NFR  |  B  |
| ABC  |  C  |

上面是两个表的示例数据,它们为了创建显示在此正文中的第一个表而被连接起来。

非常感谢大家!

标签: sqldb2

解决方案


NOT EXISTS 运算符可用于执行此任务:

SELECT distinct Col1 ,  Col2
FROM table t
WHERE NOT EXISTS(
  SELECT 1 FROM table t1
  WHERE t.col1=t1.col1 AND t.col2 <> t1.col2
)

推荐阅读