右表

时间:2017-09-11 18:35:46

标签: sql-server join sql-server-2005 sql-server-2014

我有三张桌子。 Table Cust有一个custID字段,以及其他各种值(名称,地址等)

表列表具有单个列ID。每个ID都是Cust表中的custID 编辑:这样做的目的是过滤记录,将thge结果限制为CustID出现在列表中的那些。

所有三个表都已编入索引。

Table Trans有一个TransactionID字段,一个保存客户ID的Cust字段和其他交易字段

编辑:我应该提到在某些情况下不会有交易记录。在这种情况下,我想要一行客户信息,事务字段为null或空白。

我想要一个查询来返回列表中每个ID的cust和事务ID。如果事务表中有多个匹配的行,我希望每个包含3个匹配的cust信息。所以,如果表格看起来像这样:

    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  --       -- 

(Where - 表示NULL或BLANK)

显然,实际的表格要大得多(数百万行),但这显示了模式,表格中每个项目的一行与List表格中的任何项目匹配,以及来自Cust表格的匹配字段。如果没有匹配的事务,则列表中每个ID的一行客户信息。 CustID在Cust和List表中是唯一的,但不在事务表中。

如果重要的话,这需要在2005年以后的任何版本的SQL服务器上运行。

有什么建议吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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