Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果计数>=2且列中唯一,则Oracle查询查找记录_Sql_Oracle_Select_Count_Having - Fatal编程技术网

Sql 如果计数>=2且列中唯一,则Oracle查询查找记录

Sql 如果计数>=2且列中唯一,则Oracle查询查找记录,sql,oracle,select,count,having,Sql,Oracle,Select,Count,Having,我正在尝试编写一个查询,以选择两个或多个源IDSRCRECNO具有相同IDNUMBER的记录。我从以下几点开始查询: 其中,idnumber IN按COUNTIDNAME>=2的idnumber从表组中选择idnumber +----------+---------+------------+-----------+ | MEMRECNO | RECSTAT | IDSRCRECNO | IDNUMBER | +----------+---------+------------+-------

我正在尝试编写一个查询,以选择两个或多个源IDSRCRECNO具有相同IDNUMBER的记录。我从以下几点开始查询:

其中,idnumber IN按COUNTIDNAME>=2的idnumber从表组中选择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