2016-09-02 29 views
1

- 詳細をし、私は何を見つけたいと思うことは唯一の方法である(のような以下のものを開始最も特定のレコード検索 - SQL私は2つのテーブルのマスター持っ

Create Table #Master(MasterId int, Method varchar(100)) 
Insert Into #Master Values(1,'MasterDefault') 

Create Table #Detail(Id int, MasterId int,ATypeId int, BTypeId int,CTypeId int,DetailMethod varchar(100)) 
Insert Into #Detail 
Values(1,1,1,1,1,'Detail All'), 
     (2,1,null,1,1,'Detail ATypeId null'), 
     (3,1,null,null,1,'Detail ATypeId and Btype null'), 
     (4,1,null,null,null,'Detail all null')  

入力パラメータに基づいて、より関連性の高い結果を見つけようと、以下のようなパラメータ

イドROW1ディテール全ての入力一致として1つのレコードイド - 詳細を返すたいこの場合

declare @Id int =1, 
     @AtypeId int =1, 
     @BtypeId int=1, 
     @CtypeId int =1 

Select * 
from #Master M 
    left outer join #Detail D on M.MasterId = D.MasterId 
Where M.MasterId = @Id 
    AND (([email protected]) OR (D.ATypeId IS NULL))  
    AND (([email protected]) OR (D.BTypeId IS NULL))  
    AND (([email protected]) OR (D.CTypeId IS NULL))  

)マスターまたは詳細のいずれかから

declare @Id int =1, 
     @AtypeId int =null, 
     @BtypeId int=1, 
     @CtypeId int =1 

IDが2であなたのために動作します。この

答えて

1

シンプルAND/ORロジックを実現する上で任意のヘルプを細部から行を期待します。

SELECT * 
FROM #Master M 
     LEFT OUTER JOIN #Detail D 
        ON M.MasterId = D.MasterId 
         AND (D.ATypeId = @AtypeId 
           OR (@AtypeId IS NULL 
            AND AtypeId IS NULL)) 
         AND (D.BTypeId = @BtypeId 
           OR (@BtypeId IS NULL 
            AND BtypeId IS NULL)) 
         AND (D.CTypeId = @CtypeId 
           OR (@CtypeId IS NULL 
            AND CtypeId IS NULL)) 
WHERE M.MasterId = @Id 

注:あなたがLEFT OUTER JOINを使用しているので、私はON条件に右のテーブルフィルタを移動しました。 LEFT OUTER JOINを使用し、右側のテーブルレコードをWhere節にフィルタすると、暗黙的にINNER JOIN

に変換されます
関連する問題