SQL交叉引用表自引用

时间:2015-10-21 02:25:56

标签: sql postgresql

我正在开展一个项目,我有一个

all_names(
  team_name TEXT,
  member_name TEXT,
  member_start INT,
  member_end INT);

我的任务是创建一个

participants(
  ID SERIAL PRIMARY KEY,
  type TEXT,
  name TEXT);

包含所有团队和成员名称作为他们自己的条目。类型可以是“团队”或“成员”。

为了赞美这个参与者表,我试图创建一个交叉引用表,允许成员通过ID引用团队,反之亦然。我的表看起来像这样:

belongs_to(
  member_id INT REFERENCES participants(ID),
  group_id INT REFERENCES  participants(ID),
  begin_year INT,
  end_year INT,
  PRIMARY KEY (member_id, group_id);

我不确定如何正确地进行和填充表格。

我到目前为止的选择查询是:

SELECT DISTINCT ON (member_name, team_name)
  id, member_name, team_name, member_begin_year, member_end_year
FROM all_names
INNER JOIN artists ON all_names.member_name = participants.name;

但我不确定如何继续。填充交叉引用表的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

可能最简单的解决方案是使用一些语句。包装这是一项事务,以确保您不会遇到并发问题:

BEGIN;

INSERT INTO participants (type, name)
  SELECT DISTINCT 'team', team_name
  FROM all_names
  UNION
  SELECT DISTINCT 'member', member_name
  FROM all_names;

INSERT INTO belongs_to 
  SELECT m.id, g.id, a.member_start, a.member_end
  FROM all_names a
  JOIN participants m ON m.name = a.member_name
  JOIN participants g ON g.name = a.team_name;

COMMIT;

属于多个团队的成员会记录他们的所有会员资格。