我在PostgreSQL 9.6中有一个things
表和一个表things_persons
,表示事物和人之间的多对多关系。但是每个东西都有一个owner
列,表示一对多的关系。
我的问题的最小架构如下:
CREATE TABLE things(
thing_id SERIAL,
owner integer
);
CREATE TABLE things_persons(
thing_id integer,
person_id integer
);
INSERT INTO things VALUES(1,10);
INSERT INTO things VALUES(2,10);
INSERT INTO things_persons VALUES(1,10);
INSERT INTO things_persons VALUES(1,11);
INSERT INTO things_persons VALUES(2,11);
以下查询是我想要做的事情的一部分:
SELECT * FROM things
LEFT JOIN things_persons USING(thing_id)
结果是:
| thing_id | owner | person_id |
|----------|-------|-----------|
| 1 | 10 | 10 |
| 1 | 10 | 11 |
| 2 | 10 | 11 |
我真正想要做的是将所有者视为thing_persons表中的另一个条目。我想列出与每件事物相关联的每个人,无论他们是所有者还是在thing_persons表中。
以下代表我想要达到的结果:
| thing_id | person_id |
|----------|-----------|
| 1 | 10 |
| 1 | 11 |
| 2 | 10 |
| 2 | 11 |
对于第1项,所有者也属于person_ids,因此不应该重复。对于第2项,所有者不属于person_ids,因此应将其添加到那里。
更改架构不是一个选项,但我想不出一种方法来编写一个给我想要的结果的查询。如何写这样的查询?
答案 0 :(得分:2)
我想你只想要一个union
或union all
:
SELECT tp.thing_id, tp.person_id
FROM things_persons tp
UNION ALL
SELECT t.thing_id, t.owner_id
FROM things t;
如果您希望查询删除重复项,则可以使用union
。