2017-07-21 2 views
1

私は3つのテーブルを持っています。事は - 3つの値のうち2つに値があることはわかっていますが、3番目のテーブルにも何かがある可能性があります。私は、3番目のテーブルにはない値を表示するだけです。3つのテーブルを結合して値のうちの1つに値がない値を取得する

tbl1 
ClientID SvcGoalID  VendorID 
17   7887    784 

tbl2 
ClientID SvcGoalID  SvcAuthID 
17   7887    634 

tbl3 
ClientID SvcAuthID 
17   634  

これは基本的に私のテーブルの大まかな構造です。ここで私が探しているものがあります。私はクエリで3つのテーブルをすべて結合しようとしています - tbl1 & tbl2はSvcGoalIDを使用し、tb2 & tb3はSvcAuthIDを使用します - tbl3にNO値がSvcAuthIDの場合のみデータを表示します。どんな助けでも大歓迎です。

+1

'左tbl2.SvcAuthID = tbl3.SvcAuthID tbl3.SvcAuthIDがnull'なので – scsimon

+0

あなたがTBL3に値を言っていないときは、一致する行とのJOINをしないことを意味するんです場所にTBL3に参加? (つまり、あなたの例では、tbl3.SvcAuthID = 633の場合は、データを返すことになります) – yanman1234

+0

@scsimon - ClientIDは使用できません - tbl1とtbl2の間のSvcGoalIDでなければなりません。 20-30は同じクライアントのtb1とtbl2の間に記録され、同じことがtbl3の間に入ります。私はsvcGoalIDとsvcAuthIDを使用することができます – BobSki

答えて

2

あなたは、tbl3に値がない場合、tbl1と2から値を取得したいと述べました。ここでは、それが定義されているとして、あなたがそのクエリを実行する場合は、あなたが定義され、それが加入して返します参照してくださいよ...

declare @tbl1 table (ClientID int, SvcGoalID int, VendorID int) 
insert into @tbl1 
values 
(17,7887,784) 

declare @tbl2 table (ClientID int, SvcGoalID int, SvcAuthID int) 
insert into @tbl2 
values 
(17,7887,634) 

declare @tbl3 table (ClientID int, SvcAuthID int) 
insert into @tbl3 
values 
(17,634) 


select 
    t1.* 
    ,t2.* 
    ,t3.* 
from 
    @tbl1 t1 
    inner join 
    @tbl2 t2 on t2.SvcGoalID = t1.SvcGoalID 
    left join 
    @tbl3 t3 on t3.SvcAuthID = t2.SvcAuthID 
--where 
-- t3.SvcAuthID is null 

を構造への参加があります。 where句のコメントを外すと、tbl3に結合条件が存在するため、行が返されません。しかしながら。通常、これは行を追加する必要がある場合に実行され、現在はかなり冗長です。

あなたの結合構造は基本的にこれらのすべてを内部結合にします。 @ TBL3に異なる値を追加すると、私は最初、私はCASEステートメントを使用します(この場合のTBL1とTBL2で)二次テーブルをJOINをLEFTでしょう。この..

declare @tbl1 table (ClientID int, SvcGoalID int, VendorID int) 
insert into @tbl1 
values 
(17,7887,784) 

declare @tbl2 table (ClientID int, SvcGoalID int, SvcAuthID int) 
insert into @tbl2 
values 
(17,7887,634) 

declare @tbl3 table (ClientID int, SvcAuthID int) 
insert into @tbl3 
values 
--(17,634), 
(17,555) 


select 
    t1.* 
    ,t2.* 
    --,t3.* 
from 
    @tbl1 t1 
    inner join 
    @tbl2 t2 on t2.SvcGoalID = t1.SvcGoalID 
    left join 
    @tbl3 t3 on t2.SvcAuthID = t3.SvcAuthID 
where 
    t3.SvcAuthID is null 
0

を変更します。例えば

SELECT 
    3.ClientID 
    ,CASE WHEN 3.SvcGoalID ISNULL THEN 2.SvcGoalID ELSE 1.SvcGoalID END 
    -- Use above statement for all possible missing columns 

FROM tbl1 as 1 
LEFT OUTER JOIN tbl3 as 3 ON 3.ClientID = 1.ClientID 
LEFT OUTER JOIN tbl3 as 2 ON 2.ClientID = 1.ClientID 
関連する問題