2017-07-27 4 views
1

私はコースのテーブルを持っています:c_inst、c_year、c_program_type、c_unique_key。私はc_program_typeが 'V'から 'P'へと2016から2017までの間で変更された場所を見つけたいと思います。これを実行するには問題があります。ここで私が試したものであり、私はそれが間違ってちょうど平らなことを知っている:前の年から変更されたすべてのレコードを選択しようとしています

select * from courses a 
where c_program_type in ('P','V') 
and c_year = '2017' 
and c_program_type != (select c_program_type from courses b where 
         a.c_unique_key = b.c_unique_key and c_year = '2016') 

SQL noobのためにこれを行うための最も簡単な方法は何ですか?私はまた、SQL Serverの一時テーブルを使用してみましたが、そこに運がなかった。前もって感謝します!

+1

を試すことができますか後者の場合は、古い行が廃止されたことをどのようにフラグしますか? – Cowthulhu

+0

PとVは 'c_program_type'のための唯一の許容値ですか、それとももっと可能性がありますか? – Haris

+0

c_program_typeにはもっと可能性がありますが、私は特にPとVを探しています。 – Emily

答えて

1

あなたは「V」と「P」の間の行を切り替えると、既存の行を更新するか、新しいものを追加していますか?

SELECT a.* 
FROM courses a 
     LEFT JOIN courses b 
       ON a.c_unique_key = b.c_unique_key 
       AND a.c_program_type = b.c_program_type 
       AND b.c_year = '2016' 
WHERE a.c_program_type IN ('P', 'V') 
     AND a.c_year = '2017' 
     AND b.c_unique_key IS NULL 
関連する問題