【问题标题】:My query only returns 1 row. I expect more我的查询只返回 1 行。我期待更多
【发布时间】:2015-08-03 14:49:16
【问题描述】:

我正在尝试对具有 2 个连接的表的结果集中的值求和。

我有一个名为 Limit 的表。 一个限制有许多分配。 一个限制也有许多扩展。 分配和扩展都有一个实体。

当我在 where 子句中使用 Oid 指定 Limit 时,我会返回一条记录。即使限制有 9 个分配。 如果限制有 9 个分配和 0 个扩展,我仍然得到 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

【问题讨论】:

  • 请包含您使用的数据库作为标签。

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


【解决方案1】:

通过使用连接,您期望连接表上的结果,如果没有结果,那么它将失败。

如果无论你加入的表上是否有匹配的记录,你仍然想要你拥有的数据,你需要使用左连接。

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 

【讨论】:

  • 我在每个分配和扩展上都试过这个。还是 0 个结果。
  • 不加入源实体会发生什么
  • 其实。我只是在 SourceEntity 上放置了一个左连接,我确实收到了 1 条记录。只是分配。但我仍然期待所有 9 条分配记录。
  • 我更新了我的查询。我在查询中添加了左连接。即使限制上的扩展名为零,我现在也得到了结果。但它仍然只返回 1 条记录。给定的限制有 9 个分配。我仍然希望返回所有 9 个分配。
  • 谢谢!我删除了源实体上的左连接。我从分配中添加了一个源实体字段。我得到了 9 条记录!谢谢你的帮助!我将在上面更新我的查询。
【解决方案2】:

您需要在表上使用Left Join,因为您没有指定连接类型将应用内连接,因为只会显示Join中所有表的匹配行。

要从中获取记录的表,无论其他表中是否存在记录,都应用作左表。

如果您想在 Oid = '893de7ad-0ed2-462f-8bac-a26718b3e798' 的情况下获取 Limit 表中的所有数据,则应使用此表如果要获取 limitallocation 的所有数据,无论数据是否存在于 limitextension 表中,然后在 limitallocation 应该用在左侧。

您的查询将是

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多