2015-10-07 182 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是不必要在這裏。