我有一个包含ID
列和Val
列的表格。对于ID
的每个值,我们可以具有相同或不同的Val
值。
ID Val
1 A
1 NULL
2 00
2 00
2 00
2 00
3 00
3 A
4 A
5 00
5 00
5 A
6 A
6 A
6 NULL
6 00
从上表中,我正在寻找Val列中具有不同值的ID。如果对于任何给定的ID,Val列的所有值都相同,那么它不应该出现在结果中。
所以结果就像是。
D Val
1 A
1 NULL
3 00
3 A
5 00
5 00
5 A
6 A
6 A
6 NULL
6 00
Id 2不应该出现,因为对于Id 2,Val列具有相同的数据。 类似地,ID 4不会出现,因为ID 4只有一行。
对于每个ID,如果我们在Val列中有多个值,那么它应该显示在结果中。
感谢您的帮助!
答案 0 :(得分:1)
对于满足具有不同值的条件的ID:
select id
from t
group by id
having min(id) <> max(id);
然后,您可以将其合并到一个查询中:
select t.*
from t join
(select id
from t
group by id
having min(id) <> max(id)
) tt
on t.id = tt.id;
或者,您可以使用窗口函数:
select t.id, t.val
from (select t.*,
min(val) over (partition by id) as minval,
max(val) over (partition by id) as maxval
from t
) t
where minval <> maxval;
答案 1 :(得分:0)
试试这个:
SELECT ID, Val
FROM mytable
WHERE ID IN (SELECT ID
FROM mytable
GROUP BY ID
HAVING COUNT(DISTINCT CASE
WHEN Val IS NULL THEN ''
ELSE Val
END) > 1
我假设Val
字段的类型为VARCHAR
,并且可以是NULL
或<> ''
。
答案 2 :(得分:0)
通过三个步骤构建查询:
尝试使用内部选择而不是subselect来加速查询。
解决方案写在下面的查询中:
SELECT
t.*
FROM
-- select only ids with distinct count > 1
(
SELECT
id
FROM
-- select distinct values to ensure your count of null values is real
(
SELECT DISTINCT
id, val
FROM
t
) AS td
GROUP BY
id
HAVING
COUNT(*) > 1
) AS tc
-- join the source table
INNER JOIN
t
ON
t.id = tc.id