0

Referenceテーブルが次のような親 + 参照テーブルが与えられた場合

Ref_ID    PARENT_ID    
-------------------
1           1            
2           1            
1           2       
3           2       
1           3       
3           3       
4           3       
2           4       
3           4       

ref_id2 と 3 の両方を含むすべての個別の親行を返そうとしています

クエリ

SELECT *
FROM  Parent 
WHERE parent_id in (SELECT parent_id from XRefTable where ref_id in (2, 3) )

すべてのparent_id 1、2、3、4を返します

必要な正しい結果は、ref_id の 2 と 3 の両方を持つ parent_id 4 を返すことですが、他は 2 または 3 のいずれかを持っています。

どんな助けでも大歓迎です

参考までに - クエリには (ユーザーの選択に応じて) 4 ~ 7 個のテーブルがあるため、パフォーマンスが大きな要因になります。

SORRYはSQL Server CEでも動作する必要があるため、ストアドプロシージャを使用できません

4

3 に答える 3

0
 SELECT parent_id 
 from XRefTable 
 where ref_id in ( 2, 3 ) 
 group by PARENT_ID 
 having count(distinct ref_id) = 2
于 2012-10-23T15:28:56.453 に答える
0

セットごとの比較をしようとしています。このために、group byandhaving句を強くお勧めします。

select parent_id
from Reference r
group by parent_id
having sum(case when ref_id = 2 then 1 else 0 end) > 0 and
       sum(case when ref_id = 3 then 1 else 0 end) > 0

句の各コンポーネントはhaving、フィールドの 1 つをカウントしています。ロジックでは、両方が存在する必要があります。

私が他のアプローチよりもこのアプローチを好む理由は、基本的に同じ構造を使用してロジックを変更できるからです。

リストがカンマ区切りの文字列の場合、次のように動作します。おそらく「エレガント」でも「リレーショナル」でもありませんが、機能します。

set @Ref_ids = "1,2,3,4"

select parent_id
from Reference r
where charindex(','+cast(ref_id as varchar(255))+',', '+@ref_ids+',') > 0
group by parent_id
having count(distinct ref_id) = (len(replace(@ref_ids, ',', '')) - len(@ref_ids))+1

これは、文字列操作を行って、ref_id がリストにあるかどうかを判断します。次に、having句は一致の数をカウントし、リストと同じサイズであることを確認します。リストにスペースがなく、空白の値がないと仮定すると、これは機能します。

于 2012-10-23T15:30:17.903 に答える