2016-09-02 15 views
0

このようなクエリが可能かどうかはわかりません。いくつかの異なるクエリを試しましたが、目的の出力を返すものはありません。ここでは要件です:行間の条件に基づいて行を返す

私は2つのテーブルを持っている:

Header: 

Id(PK) Name 
1  A 
2  B 
3  C 

Detail: 

Id(FK) Name Min  Max 
1  X1  1  3 
1  X2  5  5 
1  X3  8  9 
2  X1  11  11 
2  X2  13  13 
2  X3  15  18 
3  X1  2  2 
3  X2  1  6 
3  X3  9  11 

私は、次の入力を与えられたクエリが必要になります。

@X1 = 2 
@X2 = 5 
@X3 = 9 

万一出力:以来

Id(PK) Name 
1  A 
3  C 

提供された値は、詳細テーブルの最小値と最大値の間にあります。

また、0の入力は、例えばので、何の範囲を示していない:

@X1=0 
@X2=0 
@X3=16 

万一出力:

Id(PK) Name 
2  B 

X1との@ X2 @ 0であり、いずれかの間で該当しないにもかかわらず、ここで0は「すべてが許容できる」ことを意味します。 @ X3も0であれば、すべてのレコードが範囲内に入るため、すべてのヘッダID1,2,3が出力されていました。

私はこれを一時テーブルとストアドプロシージャを使用して実行することも、Javaで処理することもできます。このヘルプは大幅に

+0

を試してみることができます。実際に使用しているデータベースのタグを追加してください。 –

+0

3つの値はすべて、与えられたIdの最小値と最大値の範囲内になければなりませんか? –

+0

@TimBiegeleisen:はい、3つの値はすべて範囲の間にある必要があります。最初の例を見てください。データセットをよりよく反映するように更新しました –

答えて

0

はこれを試してみてくださいいただければ幸い

直接SQLを介して可能であった場合、私は思っていた:

select distinct d1.ID 
from Detail d1 
    inner join Detail d2 on d2.ID = d1.ID and @x2 = 0 or @x2 between d2.Min and d2.Max 
    inner join Detail d3 on d3.ID = d1.ID and @x3 = 0 or @x3 between d3.Min and d3.Max 
where @x1 = 0 or @x1 between d1.Min and d1.Max 

あなたはヘッダーから他の詳細を取得する副問合せと、それに参加するために、それをラップすることができます表。

0

あなたは、私は互換性のないデータベースのタグを削除し、以下のクエリ

SELECT DISTINCT h.Id,h.Name 
    FROM Header h 
    JOIN Details d 
     ON h.id=d.id 
    WHERE ((@x1 BETWEEN d.Min and d.Max) 
     OR (@x2 BETWEEN d.Min and d.Max) 
      OR (@x3 BETWEEN d.Min and d.Max)) 
関連する問題