2015-10-07 162 views
0

我已经运行下面的查询得到所需的10行作为结果,但它返回12行的结果更多。查询实际上是在SQL Server表的列拆分;分号分隔值,然后通过匹配那些;分裂文本值获得各自的ID从另一个表。SQL查询返回结果比要求

当我给一个PID它返回正确的结果,当我给多个PID的如(5, 7),那么它也给出了正确的结果,因为有columnname之间不匹配。

但是,当我给PID的即(5, 1956275),然后它给两行(重复/相似的)额外的结果即行数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没有看到订单,而查询是相同的。我附上了PID图像的(5,7)当没有比赛在namePID(5, 1956275)当存在name匹配。

当PID IN(5,7) - (应该有记录,这里是好的!)
enter image description here

当PID(5,1956275) - (应该有记录,并在这里被记录!)
enter image description here
请帮忙谢谢!

+0

为什么你需要在你的子查询'ROW_NUMBER'?为什么你检查它是否大于0? (它总是大于0)。我会使用'SELECT *'来调试并查看重复记录来自哪里。 –

回答

1

对不起,我没有anough口碑评论你的问题......

你为什么要使用XML结构的临时存储的地方吗?
我认为,你可以使用一个CTE表达,而不是XML的...

因此,即使它是很难理解你想做的事,我有一些建议:

  • 使用aminer.dbo。 aminer_author2paper和sub_aminer_paper在CTE表达从事群体及以上
  • 再加入aminer.dbo.aminer_author表的CTE

在所有情况下,XML是不必要在这里。