根据其他 3 列组合的重复值,获取一列具有不同值的行

Nav*_*eet 13 sql-server t-sql distinct

我想根据具有其他 3 列的唯一组合的重复行,仅获取列(列名 DEF)中具有不同值的行。

示例:在下面的示例中,前两行的前 3 列具有相同的值。但它们的列 DEF 具有不同的值。所以这两行都列在输出中。

但是第 2 行和第 4 行的前 3 列具有唯一组合,但它们在 DEF 列中具有相同的值。因此不会在输出中列出。

不会列出第 5 行和第 6 行,因为它们是具有不同值的单行。

+----------+-------+--------+--------+
| dept     | role1 |role2   |DEF     |
+----------+-------+--------+--------+
| a        | abc   | er     | 0      |
| a        | abc   | er     | 1      |
| b        | qwer  | ty     | 0      |
| b        | qwer  | ty     | 0      |
| c        | der   | ui     | 1      |
| d        | nerr  | io     | 0      |
+----------+-------+--------+--------+
output

+----------+------+------+------+
| dept     | role1|role2 |DEF   |
+----------+------+------+------+
| a        | abc  | er   |0     |
| a        | abc  | er   |1     |
+----------+------+------+------+
Run Code Online (Sandbox Code Playgroud)

我尝试使用 distinct 有但无法检查列 DEF 的值以获得所需的结果。

谁可以帮我这个事?

Jul*_*eur 17

在大多数 RDBMS 上使用标准 SQL,有多种方法。

使用子查询:

SELECT d.dept, d.role1, d.role2, DEF
FROM data d
INNER JOIN (
    SELECT dept, role1, role2 
    FROM data
    GROUP BY dept, role1, role2
    HAVING COUNT(distinct DEF) > 1
) dup
    ON dup.dept = d.dept AND dup.role1 = d.role1 AND dup.role2 = d.role2
;
Run Code Online (Sandbox Code Playgroud)

子查询返回dept/role1/role2超过 1 个 distinct 的集合DEF

使用相关子查询:

SELECT d.dept, d.role1, d.role2, DEF
FROM @data d
WHERE EXISTS (
    SELECT 1 
    FROM @data 
    WHERE dept = d.dept AND role1 = d.role1 AND role2 = d.role2 AND DEF <> d.DEF
);
Run Code Online (Sandbox Code Playgroud)

子查询返回 0 到 n 行。如果至少存在一行,则返回主表中的行。

使用CROSS APPLY

SELECT d.dept, d.role1, d.role2, d.DEF
FROM @data d
CROSS APPLY (
    SELECT n=1 
    FROM @data 
    WHERE dept = d.dept AND role1 = d.role1 AND role2 = d.role2 AND DEF <> d.DEF
) ca
;
Run Code Online (Sandbox Code Playgroud)

CROSS APPLY 适用于 Oracle 或 SQL Server。

输出:

dept    role1   role2   DEF
a       abc     er      0
a       abc     er      1
Run Code Online (Sandbox Code Playgroud)