SQL Server返回具有表联接的前X行

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

我已经尽可能地简化了这个问题

我正在将发票表中的行添加到临时表中。临时表中的每个ID都是唯一的:

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还是可以更多?