2015-10-21 2 views
1

Я работаю над проектом, где у меня есть таблицаSQL таблица перекрестных ссылок самореференция

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

То, что я была поставлена ​​задача создает таблицу

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

, который содержит все имена команд и членов в качестве их собственных записей. Тип может быть либо «командой», либо «членом».

Чтобы добавить комплимент в эту таблицу участников, я пытаюсь создать таблицу перекрестных ссылок, которая позволяет привязывать участника к команде по идентификатору и наоборот. Мой стол выглядит так:

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; 

, но я не уверен, как поступить. Каков правильный способ заполнения перекрестной справочной таблицы?

+0

Где первичный ключ: all_names; Вы должны стремиться к целому числу. – Alexandros

+0

'project4 = all_names' и' artist = участники'? – Patrick

+0

Что мешает вам ссылаться на «команду» в 'own_to.member_id' и наоборот? –

ответ

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; 

пользователей, которые являются частью нескольких команд получают все их членством записаны.

Смежные вопросы