这是我的表:
ID|2ndID|Value
1|ABC|103
2|ABC|102
3|DEF|103
4|XYZ|105
我的查询应该返回第二个ID只有一个值= 103的ID的所有实例。它不应该返回1和2,因为除了103,ABC也有102。 3 | DEF另一方面只有一个值= 103.我需要这样的行。因为值<>所以我也不需要4 | XYZ。 103.根据上面的样本集,我的结果应该只是。
3|DEF|103
我可以使用具有COUNT(*)= 1的2ndID组,它将返回所有但我不知道如何仅将其过滤为值= 103。
提前致谢。
答案 0 :(得分:1)
这应该返回具有单个2ndId值的所有行
select * from
my_table where 2ndId in (
select 2ndId
from my_table
group by 2ndId
having count(*) =1
)
如果您需要为值103强制执行过滤器
select * from
my_table where 2ndId in (
select 2ndId
from my_table
group by 2ndId
having count(*) =1
)
and value = 103
答案 1 :(得分:1)
这是聚合查询中HAVING
子句的标准应用程序。您希望按第二个ID进行分组,并仅选择只有一行且min(值)为103的组。MIN(value)
将是唯一行中的唯一值,仅在具有一行的组中一行开头;而且你不关心任何其他团体。
评论:此解决方案假设组合(second_id, value)
是唯一的 - 对于不同的ID,它不能多次出现在表格中。我在原始问题的评论中询问了OP,以澄清事实是否确实如此。
with
mytable ( id, second_id, value ) as (
select 1, 'ABC', 103 from dual union all
select 2, 'ABC', 102 from dual union all
select 3, 'DEF', 103 from dual union all
select 4, 'XYZ', 105 from dual
)
-- End of SIMULATED inputs (for testing only, NOT PART OF THE SOLUTION).
-- SQL query begins BELOW THIS LINE. Use your actual table and column names.
select min(id) as id, second_id, min(value) as value
from mytable
group by second_id
having count(*) = 1 and min(value) = 103
;
ID SECOND_ID VALUE
-- --------- -----
3 DEF 103