2017-11-01 9 views
1

私はDBMSとしてPostgreSQLを使用してSQLを学習していますが、簡単なようなクエリには問題があります。 私は、自分の言語や他のすべてのアプリとは異なる年のアプリを見つけるはずです。SQL exists節は常にtrueです

select p.id, p.language, p.year 
from app p 
where not exists (select * 
      from app p2 
      where (p.id!=p2.id) AND (p.language=p2.language OR p.year=p2.year)) 

が私のテーブルのエントリがあります動作しない私の解決策(結果なし)のID(各アプリケーションのためのユニークな)、年、言語

: ザ・アプリケーションテーブルには、3つの属性があります。

These

+0

@a_horse_with_no_name。 。 。それはまさに正しいロジックではありません。それは、その言語/年のペアが繰り返されていないことを確認するでしょう。 –

答えて

1

二つの別々の比較としてこれを行います。

select p.id, p.language, p.year 
from app p 
where not exists (select 1 
        from app p2 
        where p.id <> p2.id AND p.year = p2.year 
       ) or 
     not exists (select 1 
        from app p2 
        where p.id <> p2.id AND p.language = p2.language 
       ) ; 

これらを1つのステートメントに結合する際の問題は、どちらか一方の比較が他方のステートメントをオーバーライドすることです。そのため、別の行に重複するlanguageが存在する場合は、一致する行があり、not existsフィルタが有効になります。 yearを見る必要はありません。

関連する問題