Tsql SQL Server 2012将参数从主查询传递到联接的子查询

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

我需要从一些联接表中选择一些设置,但仅当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=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