0

条件に一致しないすべてのレコードを検索しようとしています。

キーの組み合わせ (wbs1、wbs2、wbs3) ごとに多くのレコードが存在する可能性がある 1 対多のテーブルがあります。コンボごとにこのテーブルをクエリし、「in」基準に一致するレコードがテーブルにない場合にのみコンボ (wbs1、wbs2、wbs3) を返そうとしています。

しかし、現時点では、私のクエリはすべてを返すか、何も返さないようです。

select distinct wbs1, wbs2, wbs3
     from dbo.Registry
     where not exists ( select wbs1, wbs2, wbs3, InspType
                        from Registry
                        where ISNULL(InspType,'') IN ('Test 1','Test 2')
                       )

返してほしいのは、wbs1、wbs2、wbs3 のリストです。テーブル「Registry」には、Test (InspType) 基準に一致するエントリはありません。

ありがとう!

4

2 に答える 2

0

あなたはかなり近いように見え、サブクエリはおそらく必要ありませんが、この変更により正しい結果が得られるはずです. しかし、書かれているように、外側のクエリ、つまりdbo.Registry rエイリアスを参照する方法が必要です。

select distinct wbs1, wbs2, wbs3
     from dbo.Registry r
     where not exists ( select 1
                        from Registry
                        where ISNULL(InspType,'') IN ('Test 1','Test 2')
                        and (wbs1 = r.wbs1 or wbs2 = r.wbs2 or wbs3 = r.wbs3)
                       )

これは、何らかの種類の Microsoft Sql Server を想定しているため、MySql や Oracle などで動作するかどうかはわかりません。

しかし、あなたもできませんでした

select distinct wbs1, wbs2, wbs3
from dbo.Registry
where ISNULL(InspType, '') != 'Test 1'
and ISNULL(InspType, '') != 'Test 2'

サブクエリを完全に回避しますか?

于 2013-09-19T16:08:04.373 に答える
0

havingこれは「set-within-sets」サブクエリのように聞こえますが、句の集計とロジックで解決するのが好きです。以下は、1 つまたは両方のテストが欠落しているすべての組み合わせを返します。

select wbs1, wbs2, wbs3
from dbo.Registry r
group by wbs1, wbs2, wbs3
having sum(case when InspType = 'Test 1' then 1 else 0 end) = 0 or
       sum(case when InspType = 'Test 2' then 1 else 0 end) = 0;
于 2013-09-19T15:58:30.773 に答える