SQL 查询返回的结果超过要求

SQL query returning results more than required

我有 运行 以下查询以获取所需的 10 行作为结果,但它正在 returning 12 行作为结果。该查询实际上是在 SQL 服务器 table 的列中拆分 ; 分号分隔值,然后通过匹配那些 ; 从另一个 table 获取相应的 ID拆分文本值。

当我给出单个 PID 时,它 return 正确的结果,当我给出多个 PID 时,例如(5, 7),那么它也会给出正确的结果,因为 columnname 之间没有匹配。

但是当我给出 PID(5, 1956275) 时,它会在结果末尾额外给出两行 (repeated/similar) 即行号 1112 与行号 12 完全相同。

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 在这里都是不必要的。