基于count(value)返回行= 1

时间:2013-02-22 19:15:57

标签: sql db2

我有类似的查询:

select
    clm.CLM_ID,
    csv.CSV_PRC_CD
FROM
    CLM_CLAIM clm inner join CSV_CLM_SRV csv on clm.CLM_iD = csv.CSV_CLM_ID
GROUP BY
    clm.CLM_ID,
    csv.CSV_PRC_CD

我的结果看起来像这样:

CLM_ID      CSV_PRC_CD     
----------- ---------------
       5087 0270           
       5087 0305           
       5087 0351           
       5087 0637           
       5087 0730           
     365294 99221          
     406116 0250           
     406116 0300           
     406116 0450           
     523504 99202          
     602677 73080          
     602677 73100          
     901343 97002          
     901343 97014          
    1040368 00190          
    1250851 93306   

我想要完成的只是返回只有一个与CLM_ID关联的CSV_PRC_CD的行。所以我的结果应该是这样的:

CLM_ID CSV_PRC_CD


 365294 99221          
 523504 99202          
1040368 00190          
1250851 93306   

我的结果中应忽略CLM_ID与其关联的CSV_PRC_CD超过1 {{1}}的任何内容。

2 个答案:

答案 0 :(得分:1)

我认为最简单的查询是:

select clm.CLM_ID, MIN(csv.CSV_PRC_CD) as CSV_PRC_CD
FROM CLM_CLAIM clm inner join CSV_CLM_SRV csv on clm.CLM_iD = csv.CSV_CLM_ID
GROUP BY clm.CLM_ID
having COUNT(distinct csv.CSV_PRC_CD) = 1

通过使用以下having子句,可以稍微提高效率:

having min(csv.CSV_PRC_CD) = max(csv.CSV_PRC_CD)

count(distinct)通常比min()max()更加耗费资源。

答案 1 :(得分:0)

一种方法是使用COUNT(*) = 1加入自身:

SELECT
    clm.CLM_ID,
    csv.CSV_PRC_CD
FROM
    CLM_CLAIM clm 
        INNER JOIN CSV_CLM_SRV csv on clm.CLM_iD = csv.CSV_CLM_ID
        INNER JOIN (
               SELECT CSV_CLM_ID
               FROM CSV_CLM_SRV 
               GROUP BY CSV_CLM_ID 
               HAVING COUNT(*) = 1 ) T
          ON T.CSV_CLM_ID = csv.CSV_CLM_ID

我认为您不再需要保留GROUP BY,但如果您的Claim表中有多条记录,那么您可以将其添加回来。