2012-10-07 43 views
0

在下面的示例中,我有一個包含作者及其論文的書目表。例如,作者'001'和'003'一起寫了文章'678'。爲MySQL重寫SQL Server查詢

articleId | authorId 
123 | 001 
123 | 002 
345 | 002 
345 | 003 
345 | 004 
678 | 001 
678 | 003 

我需要根據他們的共同作者選擇作者之間的共現。例如,對於上面的表格,我需要構建下表:

AuthorA | AuthorB 
001 | 002 
002 | 003 
002 | 004 
003 | 004 
001 | 003 

第一個表格非常大(約爲1.800.000行)。當我第一次嘗試使用MS SQL Server 2008時,第二張表的構建很快,但我現在被MySQL困住了。我用下面的查詢:

SELECT foo.authorId AS authorA, bar.authorId AS authorB 
    FROM 
    (SELECT * FROM tblAuthorHasBib) AS foo, 
    (SELECT * FROM tblAuthorHasBib) AS bar 
    WHERE 
    foo.articleId = bar.articleId 
    AND 
    foo.authorId <> bar.authorId 
    GROUP BY foo.authorId, bar.authorId 

如何重寫我的查詢速度是與MS SQL?預先感謝任何指針。

回答

3

您可以編寫您的查詢,如下所示,這將避免使用GROUP BY子句和任何內嵌視圖。

SELECT foo.authorId AS authorA, bar.authorId AS authorB 
FROM tblAuthorHasBib foo 
JOIN tblAuthorHasBib bar 
    ON foo.articleId = bar.articleId 
WHERE foo.authorId != bar.authorId 

另外,按照@ 1osmi的評論,如果你想只有作者的獨特排列,那麼你可以更換!=<如下圖所示

SELECT foo.authorId AS authorA, bar.authorId AS authorB 
FROM tblAuthorHasBib foo 
JOIN tblAuthorHasBib bar 
    ON foo.articleId = bar.articleId 
WHERE foo.authorId < bar.authorId 
+0

快速,超快速。謝謝! – Andrej

+1

該查詢返回作者的所有排列 - 例如1 | 2和2 | 1。它應該被編輯以返回唯一的組合(在上面的例子中只是1 | 2)。 – 1osmi

+0

@ 1osmi是的,但問題中的原始SQL Server查詢也如此。 – acatt