在连接表时合并一对多和多对多关系

时间:2017-02-23 13:03:03

标签: sql postgresql

我在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,因此应将其添加到那里。

更改架构不是一个选项,但我想不出一种方法来编写一个给我想要的结果的查询。如何写这样的查询?

1 个答案:

答案 0 :(得分:2)

我想你只想要一个unionunion 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