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
我需要 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