我的查询只返回1行。我期待更多

时间:2015-08-03 14:49:16

标签: sql select join sql-server-2012 isnull

我试图在具有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

2 个答案:

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