SQL Server返回带有表连接的前X行

时间:2018-07-13 21:20:19

标签: 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',
                    '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脚本正在超时。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

一种简单的方法使用XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlString); XmlNodeList xnList = doc.SelectNodes("/epg/programme"); foreach (XmlNode n in xnList) { foreach (XmlNode n1 in n.ChildNodes) { if (n1.HasChildNodes) { AppendText($"n1 has {n1.ChildNodes.Count} ChildNodes"); foreach (XmlNode n2 in n1.ChildNodes) { Append(41,n2.Name, n2.InnerText); } } else { // this will never called Append(46,n1.Name, n1.InnerText); } } } <?xml version="1.0" encoding="ISO-8859-1"?> <epg Ver="1"> <programme> <eventid>45072</eventid> <titles> <title>kabel eins late news</title> </titles> </programme> </epg>

cross apply

为了提高性能,您希望在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; 上建立索引。

答案 1 :(得分:1)

与领带配合使用

SELECT TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS

DECLARE @c VARCHAR(MAX)
DECLARE @t VARCHAR(MAX)
DECLARE @v VARCHAR(MAX)
DECLARE @s VARCHAR(MAX)

SET @c = COLUMN_NAME
SET @t = TABLE_NAME
SET @v = 'value'
SET @s = '['+@c+'] from ['+@t+'] where ['+@c+'] = ['+@v+']'

SELECT @s