0

列名に基づいて重複する値を見つけることが目標である SQL クエリを作成しています。

SELECT a.PROJECTNAME 
 , a.OBJECTTYPE 
 , a.OBJECTID1 
 , a.OBJECTVALUE1 
 , a.OBJECTID2 
 , a.OBJECTVALUE2 
 , a.OBJECTID3 
 , a.OBJECTVALUE3 
 , a.OBJECTID4 
 , a.OBJECTVALUE4 
  FROM PSPROJECTITEM a 
 WHERE a.projectname  = 'AZ_HCM_745' 
 AND 1 < ( 
 SELECT COUNT(*) 
  FROM PSPROJECTITEM c 
 WHERE a.objecttype = c.objecttype 
   AND a.objectid1 =c.objectid1 
   AND a.objectvalue1 = c.objectvalue1 
   AND a.objectid2 = c.objectid2 
   AND a.objectvalue2 = c.objectvalue2 
   AND a.objectid3 = c.objectid3 
   AND a.objectvalue3 = c.objectvalue3 
   AND a.objectid4 = c.objectid4 
   AND a.objectvalue4 = c.objectvalue4) 
  ORDER BY a.projectname

私の意図は、の複製であるこれらの値を見つけることです。つまりa.projectname、出力には の複製値が表示され、オブジェクトのカウントとAZ_HCM_745同じフィールドが必要です。objecttypeobjectid

私が探している出力は次のようになります。

PROJECTNAME OBJECTTYPE  OBJECTID1   OBJECTVALUE1    OBJECTID2 OBJECTVALUE2  OBJECTID3   OBJECTVALUE3    OBJECTID4   OBJECTVALUE4

これらは、クエリから選択しているフィールド名です。

今、私は a.projectname = 'AZ_HCM_745' を渡しています。

私の目標は、AZ_HCM_745 とこれらの値を持つ projectname の複製であるデータを見つけることです。

AZ_HCM_745  0   1   AUDIT_AZ_ADP11P 0       0       0    

元の値です。

重複した値は次のとおりです。

AZ_HCM_745_BKP  0   1   AUDIT_AZ_ADP11P 0       0       0   

projectname は _bkp または _a と異なる場合があることに注意してください。私の目標は、objecttype objectid1 の値が重複している projectnames を見つけることであり、これらの値を選択したいと考えています。

また、クエリは、projectname ではなく、パラメーターで渡されるプロジェクト名の重複値のみを取得する必要があります。つまり、元の値を表示してはならず、重複のみを表示する必要があります。

使用中のデータベースは Oracle です。

4

4 に答える 4

4

クエリの主な問題は、それが「裏返し」であることです。つまり、外側のクエリで対象のプロジェクトのみを選択しています。内部は類似のものをすべて選択していますが、それらはwhere節にあるため出力されていません。

このバリエーションを試してください:

SELECT a.PROJECTNAME 
 , a.OBJECTTYPE 
 , a.OBJECTID1 
 , a.OBJECTVALUE1 
 , a.OBJECTID2 
 , a.OBJECTVALUE2 
 , a.OBJECTID3 
 , a.OBJECTVALUE3 
 , a.OBJECTID4 
 , a.OBJECTVALUE4 
  FROM PSPROJECTITEM a 
 WHERE a.projectname <> 'AZ_HCM_745' and
       exists ( 
 SELECT *
  FROM PSPROJECTITEM c 
 WHERE c.projectname  = 'AZ_HCM_745' and
       a.objecttype = c.objecttype 
   AND a.objectid1 =c.objectid1 
   AND a.objectvalue1 = c.objectvalue1 
   AND a.objectid2 = c.objectid2 
   AND a.objectvalue2 = c.objectvalue2 
   AND a.objectid3 = c.objectid3 
   AND a.objectvalue3 = c.objectvalue3 
   AND a.objectid4 = c.objectid4 
   AND a.objectvalue4 = c.objectvalue4) 
  ORDER BY a.projectname

二次的な考慮事項は、NULL値が一致しないことです (これが問題である場合は、次のようなものを使用する必要がありますcoalesce())。

于 2013-06-12T05:55:54.690 に答える
0

私が間違っている場合は修正してください。あなたの目的は、プロジェクト名を使用して PSPROJECTITEM で重複した値を見つけることです。

SELECT t2.objecttype
,t2.objectid1
,t2.objectvalue1
,t2.objectid2
,t2.objectvalue2
,t2.objectid3
,t2.objectvalue3
,t2.objectid4
,t2.objectvalue4
FROM PSPROJECTITEM t2, PROJECTNAME t1
WHERE t2.objecttype = t1.objecttype
AND t2.objectid1 = t1.objectid1
AND t2.objectvalue1 = t1.objectvalue1
AND t2.objectid2 = t1.objectid2
AND t2.objectvalue2 = t1.objectvalue2
AND t2.objectid3 =t1.objectid3
AND t2.objectvalue3 = t1.objectvalue3
AND t2.objectid4 = t1.objectid4
AND t2.objectvalue4 = t1.objectvalue4
AND t1.projectname   = 'AZ_HCM_745' 

データベースに一意の ID がある場合は、それを使用してください

于 2013-06-12T06:01:09.200 に答える
-1
SELECT a.PROJECTNAME,
count(a.PROJECTNAME) as count
FROM PSPROJECTITEM a 
GROUP BY a.PROJECTNAME HAVING count(a.PROJECTNAME) >1
于 2013-06-12T05:28:11.263 に答える
-1

これを試すことができます:

  SELECT A.PROJECTNAME,A.objectid, A.objecttype ,COUNT(*) DUBLICATE FROM PSPROJECTITEM A GROUP BY A.PROJECTNAME,A.objectid, A.objecttype HAVING COUNT(*)>1

于 2013-06-12T05:51:15.643 に答える