Sql 如果计数>=2且列中唯一,则Oracle查询查找记录
我正在尝试编写一个查询,以选择两个或多个源IDSRCRECNO具有相同IDNUMBER的记录。我从以下几点开始查询: 其中,idnumber IN按COUNTIDNAME>=2的idnumber从表组中选择idnumberSql 如果计数>=2且列中唯一,则Oracle查询查找记录,sql,oracle,select,count,having,Sql,Oracle,Select,Count,Having,我正在尝试编写一个查询,以选择两个或多个源IDSRCRECNO具有相同IDNUMBER的记录。我从以下几点开始查询: 其中,idnumber IN按COUNTIDNAME>=2的idnumber从表组中选择idnumber +----------+---------+------------+-----------+ | MEMRECNO | RECSTAT | IDSRCRECNO | IDNUMBER | +----------+---------+------------+-------
+----------+---------+------------+-----------+
| MEMRECNO | RECSTAT | IDSRCRECNO | IDNUMBER |
+----------+---------+------------+-----------+
| 556787 | D | 5 | 956645789 |
| 123456 | A | 5 | 956645789 |
| 546578 | A | 5 | 462454322 |
| 262441 | A | 4 | 462454322 |
| 657855 | D | 3 | 462454322 |
| 746877 | A | 5 | 654988844 |
| 989455 | A | 2 | 654988844 |
| 444863 | A | 1 | 654988844 |
+----------+---------+------------+-----------+
结果中包括MEMRECNO 546578和262441。这是因为两条记录都处于活动状态,IDNUMBER相同,IDSRCRECNO不同
MEMRECNO 556787和123456将不包括在内,因为即使IDNumber匹配,其中一条记录/recstat也会被删除
Memrecno 262441和657855将不包括在内,因为即使IDNumber匹配且IDSRCCONO不同,其中一条记录/recstat也会被删除
Memrecno 262441和657855将不包括在内,因为即使IDNumber匹配且IDSRCCONO不同,其中一条记录/recstat也会被删除
Memrecno 746877、989455、444863将被包括在内,因为这三条记录都处于活动状态,IDSRCRECNO不同,IDNUMBERs匹配
提前谢谢 我认为你的WHERE子句应该是
Expected Results:
我认为你的WHERE条款应该是
Expected Results:
我想这样做:
WHERE idnumber in ( SELECT idnumber
FROM ( SELECT count(*), idnumber
FROM table
GROUP by idnumber
HAVING count(*) >= 2
) temp
)
返回:
with data as (
select 556787 memrecno, 'D' recstat, 5 idsrcrecno, 956645789 idnumber from dual union all
select 123456 memrecno, 'A' recstat, 5 idsrcrecno, 956645789 idnumber from dual union all
select 546578 memrecno, 'A' recstat, 5 idsrcrecno, 462454322 idnumber from dual union all
select 262441 memrecno, 'A' recstat, 4 idsrcrecno, 462454322 idnumber from dual union all
select 657855 memrecno, 'D' recstat, 3 idsrcrecno, 462454322 idnumber from dual union all
select 746877 memrecno, 'A' recstat, 5 idsrcrecno, 654988844 idnumber from dual union all
select 989455 memrecno, 'A' recstat, 2 idsrcrecno, 654988844 idnumber from dual union all
select 444863 memrecno, 'A' recstat, 1 idsrcrecno, 654988844 idnumber from dual
)
select *
from (
select memrecno, recstat, idsrcrecno, idnumber, count(distinct idsrcrecno) over (partition by idnumber) rec_cnt
from data
where recstat = 'A'
)
where rec_cnt > 1;
这假设您只想查看活动记录。例如,如果MEMRECNO=444863未处于活动状态,则必须更改查询,但您仍然希望它显示出来,因为仍有两条记录具有相同的IDNUMBER和不同的IDSRRecno。如果这是您想要的,请发表评论,我会相应地更新此内容。我会这样做:
WHERE idnumber in ( SELECT idnumber
FROM ( SELECT count(*), idnumber
FROM table
GROUP by idnumber
HAVING count(*) >= 2
) temp
)
返回:
with data as (
select 556787 memrecno, 'D' recstat, 5 idsrcrecno, 956645789 idnumber from dual union all
select 123456 memrecno, 'A' recstat, 5 idsrcrecno, 956645789 idnumber from dual union all
select 546578 memrecno, 'A' recstat, 5 idsrcrecno, 462454322 idnumber from dual union all
select 262441 memrecno, 'A' recstat, 4 idsrcrecno, 462454322 idnumber from dual union all
select 657855 memrecno, 'D' recstat, 3 idsrcrecno, 462454322 idnumber from dual union all
select 746877 memrecno, 'A' recstat, 5 idsrcrecno, 654988844 idnumber from dual union all
select 989455 memrecno, 'A' recstat, 2 idsrcrecno, 654988844 idnumber from dual union all
select 444863 memrecno, 'A' recstat, 1 idsrcrecno, 654988844 idnumber from dual
)
select *
from (
select memrecno, recstat, idsrcrecno, idnumber, count(distinct idsrcrecno) over (partition by idnumber) rec_cnt
from data
where recstat = 'A'
)
where rec_cnt > 1;
这假设您只想查看活动记录。例如,如果MEMRECNO=444863未处于活动状态,则必须更改查询,但您仍然希望它显示出来,因为仍有两条记录具有相同的IDNUMBER和不同的IDSRRecno。如果这是您要找的,请留言,我会相应地更新此内容。这就是您要找的吗 我刚刚在您的内部查询中添加了WHERE子句:
MEMRECNO RECSTAT IDSRCRECNO IDNUMBER REC_CNT
---------- ------- ---------- ---------- ----------
262441 A 4 462454322 2
546578 A 5 462454322 2
444863 A 1 654988844 3
989455 A 2 654988844 3
746877 A 5 654988844 3
这就是你要找的吗 我刚刚在您的内部查询中添加了WHERE子句:
MEMRECNO RECSTAT IDSRCRECNO IDNUMBER REC_CNT
---------- ------- ---------- ---------- ----------
262441 A 4 462454322 2
546578 A 5 462454322 2
444863 A 1 654988844 3
989455 A 2 654988844 3
746877 A 5 654988844 3
您也可以在不进行排序的情况下实现这一点,使用一个可能会对大量数据使用哈希半联接的查询:
SELECT idnumber
WHERE recstat <> 'D'
FROM table GROUP by idnumber
HAVING count(idnumber) >= 2
您也可以在不进行排序的情况下实现这一点,使用一个可能会对大量数据使用哈希半联接的查询:
SELECT idnumber
WHERE recstat <> 'D'
FROM table GROUP by idnumber
HAVING count(idnumber) >= 2
因此,您的第二个要求是排除已删除的recstat='D'记录?这是正确的,不应包括recstat='D'。因此,您的第二个要求是排除已删除的recstat='D'记录?这是正确的,不应包括recstat='D'。谢谢Craig。我尝试运行您的查询,但得到意外结果。例如,它显示了4个IDNUMBER,但不同的记录1234567 A 1 1234567890 2 564867 A 1 1234567890 2 356758 A 99 1234567890 2记录不是记录的总数,而是特定IDNUMBER的唯一IDSRCCNOS的总数。由于您只希望查看具有相同IDNUMBER但不同IDSRCRECNOs的记录,因此我使用此选项来筛选rec_cnt>1。事后诸葛亮说这是一个名字不好的专栏,但你明白了。谢谢克雷格。我尝试运行您的查询,但得到意外结果。例如,它显示了4个IDNUMBER,但不同的记录1234567 A 1 1234567890 2 564867 A 1 1234567890 2 356758 A 99 1234567890 2记录不是记录的总数,而是特定IDNUMBER的唯一IDSRCCNOS的总数。由于您只希望查看具有相同IDNUMBER但不同IDSRCRECNOs的记录,因此我使用此选项来筛选rec_cnt>1。事后诸葛亮说这是一个名字不好的专栏,但你明白了。谢谢大卫。假设idnumber和memrecno不匹配,这不也会显示单个记录吗?IDNUMBER应链接到至少两个来自不同来源IDSRCRECNO的活动MEMRECNO。此外,对于不同的源ID,MEMRECNO可以是相同的,例如MEMRECNO 123456可以有idsrccno 2和idsrccno 3的两条记录。谢谢你的帮助!子查询的相关性不等于memrecno的相关性,因此应该是可以的。要简单快速地检查不关联到同一条记录,可以使用t1.rowid!=谢谢大卫。假设idnumber和memrecno不匹配,这不也会显示单个记录吗?IDNUMBER应链接到至少两个来自不同来源IDSRCRECNO的活动MEMRECNO。此外,对于不同的源ID,MEMRECNO可以是相同的,例如MEMRECNO 123456可以有idsrccno 2和idsrccno 3的两条记录。谢谢你的帮助!子查询的相关性不等于memrecno的相关性,因此应该是可以的。要简单快速地检查不关联到同一条记录,可以使用t1.rowid!=t1.rowid