【发布时间】:2014-08-24 16:57:32
【问题描述】:
我有以下数据库:
paperid | authorid | name
---------+----------+---------------
1889374 | 897449 | D. N. Page
1889374 | 1795881 | C. N. Pope
1889374 | 1952069 | S. W. Hawking
我想创建一个包含以下列的表格:
- paperid
- 作者姓名 - 此论文的每位作者 ID
- 合著者 - 该论文的每位合著者
结果应该是这样的:
paperid | author | coauthors
---------+---------------+---------------------------
1889374 | D. N. Page | C. N. Pope S. W. Hawking
1889374 | C. N. Pope | D. N. Page S. W. Hawking
1889374 | S. W. Hawking | D. N. Page C. N. Pope
这是通过以下查询实现的:
SELECT foo.paperid, npa.name as author, foo.coauthors
INTO npatest
FROM newpaperauthor npa
CROSS JOIN (
SELECT paperid, string_agg(name, ' ') as coauthors
FROM newpaperauthor
GROUP BY paperid
ORDER BY paperid) foo;
UPDATE npatest SET coauthors = regexp_replace(coauthors, author, '');
SELECT * FROM npatest;
当数据库中有更多paperids 时出现问题:
paperid | authorid | name | affiliation
---------+----------+------------------+------------------------
1889373 | 122817 | Kazuhiro Hongo |
1889373 | 1091191 | Hiroshi NAKAGAWA |
1889373 | 1874415 | Hiroshi Nakagawa | University of Oklahoma
1889373 | 2149773 | Han Soo Chang |
1889374 | 897449 | D. N. Page |
1889374 | 1795881 | C. N. Pope |
1889374 | 1952069 | S. W. Hawking |
然后我将得到它们的笛卡尔积,例如:
paperid | author | coauthors
---------+------------------+----------------------------------------------------------------
1889373 | Kazuhiro Hongo | Hiroshi NAKAGAWA Hiroshi Nakagawa Han Soo Chang
1889374 | Kazuhiro Hongo | D. N. Page C. N. Pope S. W. Hawking
1889373 | Hiroshi NAKAGAWA | Kazuhiro Hongo Hiroshi Nakagawa Han Soo Chang
1889374 | Hiroshi NAKAGAWA | D. N. Page C. N. Pope S. W. Hawking
1889373 | Hiroshi Nakagawa | Kazuhiro Hongo Hiroshi NAKAGAWA Han Soo Chang
1889374 | Hiroshi Nakagawa | D. N. Page C. N. Pope S. W. Hawking
1889373 | Han Soo Chang | Kazuhiro Hongo Hiroshi NAKAGAWA Hiroshi Nakagawa
1889374 | Han Soo Chang | D. N. Page C. N. Pope S. W. Hawking
1889373 | D. N. Page | Kazuhiro Hongo Hiroshi NAKAGAWA Hiroshi Nakagawa Han Soo Chang
1889374 | D. N. Page | C. N. Pope S. W. Hawking
1889373 | C. N. Pope | Kazuhiro Hongo Hiroshi NAKAGAWA Hiroshi Nakagawa Han Soo Chang
1889374 | C. N. Pope | D. N. Page S. W. Hawking
1889373 | S. W. Hawking | Kazuhiro Hongo Hiroshi NAKAGAWA Hiroshi Nakagawa Han Soo Chang
1889374 | S. W. Hawking | D. N. Page C. N. Pope
如何摆脱那里的笛卡尔积?
【问题讨论】:
-
您想以任何特定方式对共同作者进行排序吗?
-
@ErwinBrandstetter 不是真的,对我来说没关系。
标签: sql postgresql join postgresql-9.3 cartesian-product