【问题标题】:CROSS APPLY Returning more than expected number of rowsCROSS APPLY 返回超过预期的行数
【发布时间】:2020-07-16 13:57:36
【问题描述】:

我只想从 CROSS APPLY 返回一行,但是我返回了多个 OwnershipID 行,这与我在 eSub 子查询中得到的不同。有人可以指出我做错了什么吗?

SELECT
o2.OwnershipID,
eSub.AssetID,
esub.EntityID,
esub.Entity

FROM tblOwnership o2

CROSS APPLY
(
SELECT TOP 1
a1.AssetID,
e1.EntityID,
e1.Entity,
o1.OwnershipID
FROM tblAssets a1
INNER JOIN tblOwnership o1 ON a1.AssetID = o1.AssetID
INNER JOIN tblEntity e1 ON o1.EntityID = e1.EntityID

WHERE 1=1
AND o1.OwnershipID = o2.OwnershipID
AND a1.AssetID = 1996323640

ORDER BY o1.OwnershipID DESC, o1.[Date] DESC
) eSub

WHERE 1=1
AND o2.AssetID = 1996323640

ORDER BY o2.OwnershipID DESC

【问题讨论】:

  • 我不确定我是否了解这里的问题所在。您的 CROSS APPLY 别名为 eSub 将只返回从别名为 o2 的表返回的每行 1 行。由于TOP 1,它不能返回超过。
  • @Larnu 我只想返回我粘贴的图像的第一行,但我返回了这 5 个。你知道为什么会这样吗?
  • 我不知道那张图片是什么,它来自哪里,它是什么图片?没有[date] 列,因此它似乎与您的CROSS APPLY 无关,它引用ORDER BY 中的[date]
  • 但是,您的CROSS APPLY 将只返回一个,从表对象tblOwnership o2 返回的每行如果您从tblOwnership o2 返回多行,那么CROSS APPLY 也将返回;每行 1 个。
  • 您有 5 个特定资产的所有者?

标签: sql-server inner-join cross-apply


【解决方案1】:

我想返回表中每个assetID 的前1 个ownershipID。

如果您想查看给定 AssetID 的所有记录,那么您应该只在 cross applywhere 子句中对该列应用范围。 [AssetID, EntityID, OwnershipID] 的每个组合在您的数据中似乎都是唯一的。如果您在所有三个字段上添加范围,那么将只有一个匹配记录(本身)。

使用your fiddle 我想出了this

SELECT  o2.AssetID,
        o2.EntityID,
        o2.OwnershipID as 'o2OwnID',
        eSub.OwnershipID as 'eOwnID'
FROM tblOwnership o2
CROSS APPLY
(
  SELECT TOP 1 o1.OwnershipID
  FROM tblOwnership o1 
  WHERE o1.AssetID = o2.AssetID
  /*AND o1.EntityID = o2.EntityID
    AND o1.OwnershipID = o2.OwnershipID*/
  ORDER BY o1.OwnershipID DESC
) eSub
ORDER BY o2.OwnershipID DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2022-01-01
    相关资源
    最近更新 更多