Tsql SQL Server 2012将参数从主查询传递到联接的子查询
我需要从一些联接表中选择一些设置,但仅当Items ORDER BY EndTime DESC ItemID在前1000个项目中时才需要 为此,我构建了以下查询,虽然肯定可以改进,但仍然有效:Tsql SQL Server 2012将参数从主查询传递到联接的子查询,tsql,join,sql-server-2012,subquery,Tsql,Join,Sql Server 2012,Subquery,我需要从一些联接表中选择一些设置,但仅当Items ORDER BY EndTime DESC ItemID在前1000个项目中时才需要 为此,我构建了以下查询,虽然肯定可以改进,但仍然有效: SELECT ss.ModuleCode, ss.MaxItems , w.* FROM Subscriptions ss JOIN Sellers s ON s.UID=ss.UID JOIN Items i ON s.UserID
SELECT ss.ModuleCode, ss.MaxItems , w.*
FROM Subscriptions ss
JOIN Sellers s ON s.UID=ss.UID
JOIN Items i ON s.UserID=i.UserID
JOIN Items ii ON i.ItemID=ii.ItemID
JOIN Modules mo ON ss.ModuleCode=mo.ModuleCode
JOIN Settings w ON w.UID=s.UID AND ss.ModuleCode=w.WCode
FULL JOIN GoogleFonts f ON f.FontCode=a.FontFamily
JOIN ( SELECT
ItemID
FROM Items
WHERE UserID=@UserID
ORDER BY EndTime DESC
OFFSET 0 ROWS
FETCH FIRST (1000) ROWS ONLY
) it ON it.ItemID=i.ItemID
WHERE it.ItemID=@ItemID
AND .....
但由于MaxItems并不总是1000,其值由ss.MaxItems定义,
我想用ss.MaxItems的动态值替换1000的固定值,但我还没有找到一种方法:
虽然不是最优的,因为这会使查询更重,但我尝试使用以下结果进一步查询,而不是1000:
SELECT ss.ModuleCode, ss.MaxItems , w.*
FROM Subscriptions ss
JOIN Sellers s ON s.UID=ss.UID
JOIN Items i ON s.UserID=i.UserID
JOIN Items ii ON i.ItemID=ii.ItemID
JOIN Modules mo ON ss.ModuleCode=mo.ModuleCode
JOIN Settings w ON w.UID=s.UID AND ss.ModuleCode=w.WCode
FULL JOIN GoogleFonts f ON f.FontCode=a.FontFamily
JOIN ( SELECT
ItemID
FROM Items
WHERE UserID=@UserID
ORDER BY EndTime DESC
OFFSET 0 ROWS
FETCH FIRST ( SELECT ss.MaxItems
FROM Subscriptions ss
JOIN Sellers s ON s.UID=ss.UID
JOIN Items i ON s.UserID=i.UserID
JOIN Modules mo ON ss.ModuleCode=mo.ModuleCode
JOIN Settings w ON w.UID=s.UID AND ss.ModuleCode=w.WCode
WHERE i.ItemID=@ItemID) ROWS ONLY
) it ON it.ItemID=i.ItemID
Where it.ItemID=@ItemID
AND .....
但由于它返回的值超过1,因此不被接受:限制为前1个结果,最新的子查询将工作,但不会根据需要完全动态
可以建议如何解决问题,或者至少建议解决方案的路径
谢谢 使用行号代替取回:
哇!很好!。。在ORDER附近出现错误:我假设是因为不允许按ORDER BY进行分区:我在EndTime之前修改为按用户ID ORDER进行分区。。还是有更好的解决方案?
JOIN (SELECT ItemID, ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY EndTime) as seqnum
FROM Items it
WHERE UserID = @UserID
) it
ON it.ItemID = i.ItemID AND seqnum <= ss.maxitems