2009-05-01 7 views
1

ここに私がいる状況があります。私は人々の情報を含むテーブルを持っています。一部は別のシステムからインポートされ、一部は手動でインポートされます。私がやってみたいのは、みんなを引っ張ることですが、手動で入力したレコードとインポートされたレコードがある場合は、インポートされたレコードのみを選択します(最新の可能性が高いため)。 (それだけで手動で入力されたレコードを返します)。ここSQL Server EXCEPT

は、私がこれまで持っているものですが、動作していないよう:

SELECT --fields go here 
FROM 
     (
       SELECT PERSON_UID, instype 
       FROM AdmitsInterfaceTable 
       WHERE instype='M' --Manually entered people 
      EXCEPT 
       SELECT PERSON_UID, instype 
       FROM AdmitsInterfaceTable 
       WHERE instype='I' --Imported people 
     ) P, 
     AdmitsInterfaceTable A 
    WHERE 
     P.PERSON_UID=A.PERSON_UID 
     AND P.instype=A.instype 

私はこれが原因で、内部の動作していない気がしますまた、instype列を引き出すクエリーもありますが、これを行うためのより良い方法は考えられません。何かアドバイス?

+0

レコードが手動で追加された、もう1つは、インポートから追加された場合、最初に、彼らは同じperson_uidを持っているでしょうか?もしそうであれば、インポートでレコードを追加するのではなく、なぜ更新していないのですか?なぜあなたは意図的に重複を作成していますか? また、ANSI標準結合を使用して開始してください。あなたの結合構文は17年古いです。 – HLGEM

+0

データは実際には他の場所で永続的に保持されます。ベンダーシステムにアクセスして、どのレコードを更新および/または挿入する必要があるかを判断できる、一時的なステージングポイントとしてテーブルに入れるだけです。ええ、私はステージングエリアのレコードを更新できますが、取り込んだすべてのレコードを毎晩削除してから再度プルするのは簡単です。手動でレコードを入力することはほとんどありませんが、慎重に処理しなければ問題が発生することがあります。 –

+0

提案されている解決策はどれですか? –

答えて

1
SELECT PERSON_UID, instype 
    FROM AdmitsInterfaceTable a 
    WHERE instype='I' --get all imported people    
union -- plus all manuals who are not also imported 
SELECT PERSON_UID, instype 
    FROM AdmitsInterfaceTable a 
    WHERE instype='M' --Imported people 
    and not exists ( -- without imported matches 
    select * from FROM AdmitsInterfaceTable b 
    WHERE instype='I' and b.person_uid = a.person_uid); 
0

あなたは試みることができる:

SELECT CASE WHEN b.person_UID is null THEN a.person_UID ELSE person_UID END, 
CASE WHEN b.person_UID is null THEN a.instype ELSE instype END 
--and so forth through all the columns you want 
FROM 
(SELECT PERSON_UID, instype -- add list of additional fields you need here 
from AdmitsInterfaceTable WHERE instype='M') A 
LEFT JOIN 
(SELECT PERSON_UID, instype -- add list of additional fields you need here 
from AdmitsInterfaceTable WHERE instype='I') B on A.PERSON_UID = B.PERSON_UID 
0
SELECT --fields go here 
FROM AdmitsInterfaceTable A 
WHERE 
    P.PERSON_UID=A.PERSON_UID 
    AND P.instype=A.instype 
AND instype='M' --Manually entered people 
AND person_uid not in (
SELECT PERSON_UID FROM AdmitsInterfaceTable 
WHERE instype='I' --Imported people 
)