2017-08-24 17 views
0

最初の行からすべての行を選択し、条件を満たす行、最後の行まで、別の条件を満たす必要があります。 2番目の条件を満たす行がない場合は、残りの行がすべて必要です。私はこのクエリを作ってみた:条件を満たす最初と最後の行の間のすべてのレコードを取得します。

SELECT * FROM History WHERE ID BETWEEN 
(
SELECT TOP 1 ID FROM History WHERE 
{FirstCondition} AND {GeneralCondition} ORDER BY ID ASC 
) AND (
SELECT TOP 1 ID FROM History WHERE 
{SecondCondition} AND {GeneralCondition} ORDER BY ID DESC 
) AND {GeneralCondition} 

Hovewerが、それは何も選択しない、第二の条件は、任意の行によって満たされていません。私の質問はこれも単一のクエリで可能ですか?または、アプリケーション側でさらに並べ替えを行う必要がありますか?

例: はUserID=6までUserID=3(FirstCondition)とstrating、OrderID=4(GeneralCondition)のためにすべての行を選択する必要があり(SecondCondition)

 Case 1:    Case 2: 
ID|OrderID|UserID  ID|OrderID|UserID 
-----------------  ----------------- 
1 | 4 | 4   1 | 4 | 4 
2 | 4 | 3   2 | 4 | 3 
3 | 4 | 4   3 | 4 | 4 
4 | 4 | 6   4 | 4 | 7 
5 | 4 | 4   5 | 4 | 4 
6 | 5 | 4   6 | 5 | 4 
7 | 5 | 4   7 | 5 | 4 

所望の出力:

 Case 1:    Case 2: 
ID|OrderID|UserID  ID|OrderID|UserID 
-----------------  ----------------- 
2 | 4 | 3   2 | 4 | 3 
3 | 4 | 4   3 | 4 | 4 
4 | 4 | 6   4 | 4 | 7 
         5 | 4 | 4 
+2

を有することができ、最小限の例として、テーブルとしてのサンプルデータを示しており、予想される出力してください。 –

+0

subselectを単独で実行していますか?彼らは何を返しますか? – RealCheeseLord

+0

secondConditionとは何ですか?あなたはそれに一致するデータを持っていますか? – FJT

答えて

1

どうすればいいですか?

SELECT * FROM History WHERE ID BETWEEN 
(
    SELECT MIN(ID) FROM History WHERE {FirstCondition} AND {GeneralCondition} 
) AND (
    IIF 
    (
     (SELECT MAX(ID) FROM History WHERE {SecondCondition} AND {GeneralCondition}) IS NOT NULL, 
     (SELECT MAX(ID) FROM History WHERE {SecondCondition} AND {GeneralCondition}), 
     (SELECT MAX(ID) FROM History WHERE {GeneralCondition}) 
    ) 
) AND {GeneralCondition} 

ここではサンプルSQL Fiddle

+0

はい!そのIIF機能は私が必要なものです!ありがとう! –

+1

の場合、両方の条件に一致する値が1つのみの場合MIN(ID)はMAX(ID)と等しくなり、上記のクエリは1つの行のみを返します。以下の条件はこのクエリでは満たされないようです - 2番目の条件を満たす行がない場合、残りの行がすべて必要です –

+0

@RahulRichhariya FirstConditionとSecondConditionは互いに排他的ですが、それは良い点です –

1

Conditonal集合体は、より良い計画

SELECT * 
FROM History 
WHERE ID BETWEEN 
    (
     SELECT MIN(ID) FROM History WHERE {FirstCondition} AND {GeneralCondition} 
    ) AND 
    (
     SELECT CASE WHEN MAX(CASE WHEN {SecondCondition} THEN ID END) IS NULL 
       THEN MAX(ID) 
       ELSE MAX(CASE WHEN {SecondCondition} THEN ID END) 
       END 
     FROM History 
     WHERE {GeneralCondition}) 
    ) 
    AND {GeneralCondition} 
関連する問題