SQL 查询返回的结果超过要求
SQL query returning results more than required
我有 运行 以下查询以获取所需的 10 行作为结果,但它正在 returning 12 行作为结果。该查询实际上是在 SQL 服务器 table 的列中拆分 ;
分号分隔值,然后通过匹配那些 ;
从另一个 table 获取相应的 ID拆分文本值。
当我给出单个 PID
时,它 return 正确的结果,当我给出多个 PID
时,例如(5, 7)
,那么它也会给出正确的结果,因为 column
即 name
之间没有匹配。
但是当我给出 PID
即 (5, 1956275)
时,它会在结果末尾额外给出两行 (repeated/similar) 即行号 11
和12
与行号 1
和 2
完全相同。
DECLARE @X XML
--DECLARE @paperID int
--SET @paperID = 5
DECLARE @STR VARCHAR(MAX)=''
SELECT @STR = @STR+';'+P_AUTHOR
FROM sub_aminer_paper
WHERE PID IN (5, 1956275)
ORDER BY PID ASC
SELECT @STR = substring(@STR,2,len(@STR))
SELECT @X = CONVERT(xml,' <root> <s>' + REPLACE(@STR,';','</s> <s>') + '</s> </root> ')
SELECT s.aid as [Counted_aid], s.name, p.pid, p.rank
FROM aminer.dbo.aminer_author s
INNER JOIN aminer.dbo.aminer_author2paper p ON
s.aid = p.aid AND p.pid IN (5, 1956275)
INNER JOIN (SELECT row_number()
OVER(ORDER BY (SELECT null)) AS rn, T.c.value('.','varchar(max)') AS value
FROM @X.nodes('/root/s') T(c)
) t ON t.value = s.name
WHERE rn > 0
ORDER BY rn
我不明白为什么要多出两行。在第一张图片中也有 PID
的订单,但在第二张图片中没有看到 PID
的订单,而查询是相同的。当 name
中没有匹配时,我附上了 PID
的 (5,7)
的图像,当 name
中有匹配时,我附上了 PID
的 (5, 1956275)
的图像=].
When PID IN (5, 7)--(应该有6条记录在这里就可以了!)
When PID IN (5, 1956275)--(应该有10条记录这里是12 条记录!)
请帮忙,谢谢!
抱歉,我没有足够的声誉来评论你的问题...
为什么要使用 XML 结构作为临时存储位置?
我认为,您可以使用 CTE 表达式代替 XML...
所以即使很难理解你想做什么,我也有一些建议:
- 在 CTE 表达式中使用 aminer.dbo.aminer_author2paper 和 sub_aminer_paper 执行 GROUP AND OVER
- 然后加入 aminer.dbo.aminer_author table 到 CTE
在所有情况下,XML 在这里都是不必要的。
我有 运行 以下查询以获取所需的 10 行作为结果,但它正在 returning 12 行作为结果。该查询实际上是在 SQL 服务器 table 的列中拆分 ;
分号分隔值,然后通过匹配那些 ;
从另一个 table 获取相应的 ID拆分文本值。
当我给出单个 PID
时,它 return 正确的结果,当我给出多个 PID
时,例如(5, 7)
,那么它也会给出正确的结果,因为 column
即 name
之间没有匹配。
但是当我给出 PID
即 (5, 1956275)
时,它会在结果末尾额外给出两行 (repeated/similar) 即行号 11
和12
与行号 1
和 2
完全相同。
DECLARE @X XML
--DECLARE @paperID int
--SET @paperID = 5
DECLARE @STR VARCHAR(MAX)=''
SELECT @STR = @STR+';'+P_AUTHOR
FROM sub_aminer_paper
WHERE PID IN (5, 1956275)
ORDER BY PID ASC
SELECT @STR = substring(@STR,2,len(@STR))
SELECT @X = CONVERT(xml,' <root> <s>' + REPLACE(@STR,';','</s> <s>') + '</s> </root> ')
SELECT s.aid as [Counted_aid], s.name, p.pid, p.rank
FROM aminer.dbo.aminer_author s
INNER JOIN aminer.dbo.aminer_author2paper p ON
s.aid = p.aid AND p.pid IN (5, 1956275)
INNER JOIN (SELECT row_number()
OVER(ORDER BY (SELECT null)) AS rn, T.c.value('.','varchar(max)') AS value
FROM @X.nodes('/root/s') T(c)
) t ON t.value = s.name
WHERE rn > 0
ORDER BY rn
我不明白为什么要多出两行。在第一张图片中也有 PID
的订单,但在第二张图片中没有看到 PID
的订单,而查询是相同的。当 name
中没有匹配时,我附上了 PID
的 (5,7)
的图像,当 name
中有匹配时,我附上了 PID
的 (5, 1956275)
的图像=].
When PID IN (5, 7)--(应该有6条记录在这里就可以了!)
When PID IN (5, 1956275)--(应该有10条记录这里是12 条记录!)
请帮忙,谢谢!
抱歉,我没有足够的声誉来评论你的问题...
为什么要使用 XML 结构作为临时存储位置?
我认为,您可以使用 CTE 表达式代替 XML...
所以即使很难理解你想做什么,我也有一些建议:
- 在 CTE 表达式中使用 aminer.dbo.aminer_author2paper 和 sub_aminer_paper 执行 GROUP AND OVER
- 然后加入 aminer.dbo.aminer_author table 到 CTE
在所有情况下,XML 在这里都是不必要的。