2017-09-11 18 views
0

私は3つのテーブルを持っています。テーブルCustにcustIDフィールドとその他のさまざまな値(名前、住所など)があります。右テーブルに重複がある場合にテーブルを結合する方法

テーブルリストには列IDが1つあります。各IDはCustテーブルのcustIDです Edit:これは、レコードをフィルタリングし、Thgeの結果をリストテーブルに表示されるCustIDに制限します。

3つのテーブルすべてが索引付けされます。

表トランスはTRANSACTIONIDフィールド、顧客IDを保持しているカストフィールド、そして、他の取引分野

編集を持っている:私はいくつかのケースでは何のトランザクションレコードがないことを言及している必要があります。この場合、トランザクションフィールドが空白または空白の顧客情報が1行必要です。

リストテーブルの各IDについて、custとトランザクションIDを返すクエリが必要です。トランザクションテーブルに一致する行が複数ある場合は、一致するCust情報とともに3つずつ含まれています。だから、テーブルはこのように見える場合:

Cust 
ID  Name 
01  John 
02  Mary 
03  Mike 
04  Jane 
05  Sue 
06  Frank 

    List 
ID 
01 
03 
05 
06 

     Transact 
TransID CustId Msg 
21  01  There 
22  01  is 
23  02  a 
24  03  tide 
25  04  in 
26  04  the 
27  05  affairs 
28  05  of 
29  05  men 

私がする結果セットをしたい:

CustID Name TransID Msg 
01  John 21  There 
01  John 22  is 
03  Mike 24  tide 
05  Sue 27  affairs 
05  Sue 28  of 
05  Sue 29  men 
06  Frank --  -- 

(どこに - を表すNULLまたは空白)

は明らかに実際のテーブルには、はるかに大きいです(何百万行も)、それはパターンを表示します.Custテーブルの一致するフィールドを持つ、Listテーブルの項目のいずれかと一致するテーブルTransactionの各項目の1行。一致する取引がない場合は、Listテーブルの各IDから1行の顧客情報が表示されます。 CustIDはCustテーブルとListテーブルでは一意ですが、トランザクションテーブルでは一意ではありません。

これは、2005年以降の任意のバージョンのSQL Serverで動作する必要があります。

提案がありますか?

+0

私は問題があると思われるものをかなりわからないんだけど、 joinは、join節に一致する_all_レコードを返します。さらに、あなたが言及していない目的がない限り、リストテーブルはミックスに属していないようです。顧客テーブルから取引先に直接参加することができます。あなたの質問を更新し、あなたが試した質問を追加してください。間違った結果が出た場合は、それに沿ってお手伝いしていきます。 – Eli

+0

リストテーブルは、返されるIDを制限するために使用されています。上記のおもちゃの例では、CustID値2または4の結果が表示されないようにしています。私のテストシステムでは、数万のレコードが数個に減らされ、クリーンサイトでは、トランザクションテーブルを1-2000の結果にする –

+0

適切なシステム(外部キー、インデックス)では、そのリストテーブルなしで正常に実行できるはずです。これを動作させるために何を試しましたか? – Eli

答えて

0

私は何かが欠けていない限り、これはあなたがする必要があるすべてである:

Select T.CustID, C.Name, T.TransID, T.Msg 
From  Transact T 
Join  Cust  C On C.Id = T.CustId 
Join  List  L On L.Id = C.Id 
Order By T.CustID, T.TransID 
0
;with cust (id, name) as 
(
    select 1, 'John' union all 
    select 2, 'Mary' union all 
    select 3, 'Mike' union all 
    select 4, 'Jane' union all 
    select 5, 'Sue' 
), list (id) as 
(
    select 1 union all 
    select 3 union all 
    select 5 
), transact (TransId, CustId, Msg) as 
(
    select 21, 1, 'There ' 
    union all select 22, 1, 'is' 
    union all select 23, 2, 'a' 
    union all select 24, 3, 'tide' 
    union all select 25, 4, 'in' 
    union all select 26, 4, 'the' 
    union all select 27, 5, 'affairs' 
    union all select 28, 5, 'of' 
    union all select 29, 5, 'men' 
) 
select 
    CustId = c.id, 
    Name = c.Name, 
    TransId = t.TransId, 
    Msg = t.Msg 
from cust c 
inner join list l 
    on c.id = l.id 
inner join transact t 
    on l.id = t.custid 

利回り:

CustId  Name TransId  Msg 
----------- ---- ----------- ------- 
1   John 21   There 
1   John 22   is 
3   Mike 24   tide 
5   Sue 27   affairs 
5   Sue 28   of 
5   Sue 29   men 
+0

これはほとんど動作しますが、それは私に答えを与えません –

+0

@DavidSiegelこれを含むようにあなたの投稿を更新してください - ほとんどの読者はここでそれを見つけられません – Eli

+1

トランザクションが存在するかどうかにかかわらず、すべてのcust/list行を含みます。 – Xedni

関連する問題