我有三张桌子。 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服务器上运行。
有什么建议吗?
答案 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