我已尽可能简化了问题。
我正在将发票表中的行添加到临时表中。临时表中的每个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脚本正在超时。
任何帮助将不胜感激。
答案 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