重写MySQL的SQL Server查询
在下面的例子中,我有一个包含作者及其论文的书目表。例如,作者“001”和“003”一起撰写了文章“678”重写MySQL的SQL Server查询,mysql,sql,sql-server,Mysql,Sql,Sql Server,在下面的例子中,我有一个包含作者及其论文的书目表。例如,作者“001”和“003”一起撰写了文章“678” 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 |
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
第一个表非常大,大约有1800.000行。当我第一次尝试使用MSSQLServer2008时,第二个表的构建速度很快,但我现在只能使用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一样快?提前感谢您提供的任何指针。您可以按如下所示编写查询,这样可以避免使用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的评论,如果您只需要作者的唯一排列,则可以替换!=使用可以编写如下所示的查询,这样可以避免使用GROUPBY子句和任何内嵌视图
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的评论,如果您只需要作者的唯一排列,则可以替换!=此查询返回作者的所有排列-例如1 | 2和2 | 1。应该对其进行编辑,以返回唯一的组合,如上面示例中的1 | 2。@1osmi是的,但问题中的原始SQL Server查询也是如此。@acatt true,我没有分析第一个查询,只是查看给定输入的结果应该是什么样子。若有人需要过滤掉排列,那个么这个独特的组合问题有多种解决方案。@Andrej我已经修改了我的答案,将1osmi的评论考虑在内。这只是对查询的一个小改动,以给出唯一的排列。此查询返回作者的所有排列,例如1 | 2和2 | 1。应该对其进行编辑,以返回唯一的组合,如上面示例中的1 | 2。@1osmi是的,但问题中的原始SQL Server查询也是如此。@acatt true,我没有分析第一个查询,只是查看给定输入的结果应该是什么样子。若有人需要过滤掉排列,那个么这个独特的组合问题有多种解决方案。@Andrej我已经修改了我的答案,将1osmi的评论考虑在内。这只是对查询的一个小改动,以给出唯一的排列。