我试图在具有2个连接的表上对结果集中的值求和。
我有一张名为Limit的表。 限制有许多分配。 限制也有许多扩展。 分配和扩展都有一个实体。
当我在where子句中指定带有Oid的限制时,我会返回一条记录。尽管限制有9个分配。 如果Limit有9个Allocations和0个Extensions,我仍然会得到1个返回。 即使认为极限有零延伸,我仍然期待9次分配。 我希望这是有道理的。这是我更新的查询: -----我用这个更新了我的查询。我现在获得给定限制的正确记录数量。我得到了9条记录:------
select
convert(varchar(100), l.oid) AS keyfield,
l.oid as Limit,
la.SourceEntity as SourceEntity,
SUM(ISNULL(la.ARLimit, 0)) + SUM(ISNULL(le.ARLimit, 0)) AS ARLimit,
SUM(ISNULL(la.MTMLimit, 0)) + SUM(ISNULL(le.MTMLimit, 0)) AS MTMLimit,
SUM(ISNULL(la.Volume, 0)) + SUM(ISNULL(le.Volume, 0)) AS Volume,
SUM(ISNULL(la.MaxTenor, 0)) + SUM(ISNULL(le.MaxTenor, 0)) AS MaxTenor
from limit l
left join limitallocation la
on l.oid = la.limit
left join limitextension le
on l.oid = le.limit
where l.Oid = '893de7ad-0ed2-462f-8bac-a26718b3e798'
GROUP BY l.Oid, la.SourceEntity
答案 0 :(得分:1)
通过使用join,您希望联接表上有结果,如果没有结果则会失败。
如果您仍在使用数据,无论您加入的桌子上是否有匹配的记录,您都需要使用左连接。
select
convert(varchar(100), l.oid) AS keyfield,
l.oid as Limit,
se.Oid as SourceEntity,
SUM(ISNULL(la.ARLimit, 0)) + SUM(ISNULL(le.ARLimit, 0)) AS ARLimit,
SUM(ISNULL(la.MTMLimit, 0)) + SUM(ISNULL(le.MTMLimit, 0)) AS MTMLimit,
SUM(ISNULL(la.Volume, 0)) + SUM(ISNULL(le.Volume, 0)) AS Volume,
SUM(ISNULL(la.MaxTenor, 0)) + SUM(ISNULL(le.MaxTenor, 0)) AS MaxTenor
from limit l
join limitallocation la
on l.oid = la.limit
left join limitextension le
on l.oid = le.limit
join
dbo.SourceEntity as se
on la.SourceEntity = se.oid
and le.SourceEntity = se.Oid
where l.Oid = '893de7ad-0ed2-462f-8bac-a26718b3e798'
GROUP BY l.Oid, se.Oid
答案 1 :(得分:0)
您需要在表上使用Left Join,因为您尚未指定连接内部连接的类型,因此只会显示Join中所有表的匹配行。
无论该记录是否存在于另一个表中,您希望从中获取记录的表都应该用作左表。
如果您想使用 Oid ='893de7ad-0ed2-462f-8bac-a26718b3e798'获取限制表格中的所有数据,您应该使用此表格如果你想获得 limitallocation 的所有数据,无论数据是否存在于 limitextension 表中,那么 limitallocation < / strong>应该在左侧使用。
您的查询将是
select convert ( VARCHAR ( 100), L.OID) as KEYFIELD
,L.OID as limit
,SE.OID as SOURCEENTITY
,sum ( ISNULL ( LA.ARLIMIT, 0)) + sum ( ISNULL ( LE.ARLIMIT, 0)) as ARLIMIT
,sum ( ISNULL ( LA.MTMLIMIT, 0)) + sum ( ISNULL ( LE.MTMLIMIT, 0)) as MTMLIMIT
,sum ( ISNULL ( LA.VOLUME, 0)) + sum ( ISNULL ( LE.VOLUME, 0)) as VOLUME
,sum ( ISNULL ( LA.MAXTENOR, 0)) + sum ( ISNULL ( LE.MAXTENOR, 0)) as MAXTENOR
from limit L
left join LIMITALLOCATION LA on L.OID = LA.limit
left join LIMITEXTENSION LE on L.OID = LE.limit
left join DBO.SOURCEENTITY as se
on la.SourceEntity = se.oid
and le.SourceEntity = se.Oid
where l.Oid = '893de7ad-0ed2-462f-8bac-a26718b3e798'
GROUP BY l.Oid, se.Oid