我有一张带有多个主键
ID
和ANUMBER
的表。
身份证(PK) | 数字(PK) | 姓名 | 选项 |
---|---|---|---|
1 | 1 | A | 真实 |
1 | 2 | 乙 | 真实 |
1 | 3 | C | 假 |
2 | 1 | AA | 真实 |
所以我想通过
Select
得到的是
身份证(PK) | 数字(PK) | 姓名 | 选项 |
---|---|---|---|
1 | 1 | A | 真实 |
或
身份证(PK) | 数字(PK) | 姓名 | 选项 |
---|---|---|---|
1 | 2 | 乙 | 真实 |
我不知道是否有可能建立这样一个
Select
.
先决条件是
ID
应该相等并且Option
是true
并且返回哪一行并不重要,一行就足够了,这就是为什么我在上面列出了两个有效的结果。
您可以使用
group by
和 having
子句来做到这一点:
select ID, MAX(ANUMBER) as ANUMBER, MAX(NAME) as NAME, 'true' AS OPTION
from mytable
where OPTION = 'true'
group by ID
having sum(case when OPTION = 'true' then 1 else 0 end) > 1
您似乎想要 ID 1 的任何行都有一个 true 选项。如果是这样,您可以使用
where
、order by
和 fetch first
:
select *
from mytable t
where id = 1 and option
order by anumber
fetch first 1 row only
查询筛选与给定 id 匹配且具有 true 选项的行。然后
order by
/ fetch
子句保留具有最少 anumber
的行。
如果你想一次对所有
id
获得相同的结果,我们可以引入窗口函数:
select *
from (
select t.*, row_number() over(partition by id order by anumber) rn
from mytable t
where option
) t
where rn = 1
order by id