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   

私が達成しようとしているのは、CLM_ID に関連付けられた CSV_PRC_CD が 1 つしかない行のみを返すことです。したがって、私の結果は次のようになります。

CLM_ID CSV_PRC_CD


 365294 99221          
 523504 99202          
1040368 00190          
1250851 93306   

CLM_IDに1 つ以上CSV_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

それを行う1つの方法は、次を使用してそれ自体に参加することです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 に答える