0

我有一个类似的查询:

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   

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

CLM_ID CSV_PRC_CD


 365294 99221          
 523504 99202          
1040368 00190          
1250851 93306   

任何与它相关的CLM_ID超过 1CSV_PRC_CD的东西都应该从我的结果中省略。

4

2 回答 2

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()

于 2013-02-22T19:23:27.727 回答
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 表中有多个记录,那么您可以将其添加回来。

于 2013-02-22T19:19:02.347 回答