SQL Server返回具有表联接的前X行
我已经尽可能地简化了这个问题 我正在将发票表中的行添加到临时表中。临时表中的每个ID都是唯一的:SQL Server返回具有表联接的前X行,sql,sql-server,Sql,Sql Server,我已经尽可能地简化了这个问题 我正在将发票表中的行添加到临时表中。临时表中的每个ID都是唯一的: SELECT i.InvoiceID INTO #Invoice FROM [dbo].[Invoice] WHERE invoiceID IN ('4edf2fa1-2ac7-4e0c-bf38-9675831079bc', 'c262026b-8643-4654-943c-db24f3d9f534', '6a653
SELECT i.InvoiceID
INTO #Invoice
FROM [dbo].[Invoice]
WHERE invoiceID IN ('4edf2fa1-2ac7-4e0c-bf38-9675831079bc',
'c262026b-8643-4654-943c-db24f3d9f534',
'6a6530eb-4c15-4bdf-9ea8-9cc42e0a2636')
接下来,我想将该临时表连接到另一个名为Items的表,该表的外键为InvoiceID
。以下查询返回与每个发票关联的所有项目:
SELECT i.invoiceid, itm.ItemID
FROM #Invoice i
INNER JOIN [dbo].Item itm ON itm.InvoiceID = i.InvoiceID
但是,我只想返回每张发票最多前10项。显然,如果我添加前10行,它将只返回10行,而不是每个发票返回10行
我这样做的动机是SQL脚本正在超时
任何帮助都将不胜感激。一种简单的方法使用
交叉应用
:
SELECT i.invoiceid, itm.ItemID
FROM #Invoice i CROSS APPLY
(SELECT TOP (10) itm.*
FROM [dbo].Item itm
WHERE itm.InvoiceID = i.InvoiceID
ORDER BY ??? -- however you define the top items
) itm;
为了提高性能,您需要在项(InvoiceId,?)上建立索引与领带一起使用
SELECT TOP 10 WITH TIES
i.invoiceid,
itm.ItemID
FROM
#Invoice i
INNER JOIN
[dbo].Item itm
ON itm.InvoiceID = i.InvoiceID
ORDER BY
row_number() over (partition by i.invoiceid order by i.invoiceid)
谢谢你的回答。我刚刚更新了这个问题,提到我的动机是我现有的SQL脚本正在超时。谢谢你的回答。我刚刚更新了这个问题,提到我的动机是我现有的SQL脚本正在超时。超时可能是一个糟糕的查询计划。你能在计划之前使用Brent Ozar并包括你的执行计划吗?发票ID的数量是固定为3还是可以更多?