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)