SQL Server 2012 将参数从主查询传递到 Joined 子查询

SQL Server 2012 Passing parameter from main query to the Joined subquery

我需要 select 一些连接表的一些设置,但前提是 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 .....

但由于此 returns 超过 1 个值,因此不被接受:限制为 TOP 1 结果最新的子查询将起作用,但不会按要求完全动态。

可以建议如何解决或至少建议解决方案的路径吗?

谢谢!

而不是 fetch 使用 row_number:

   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