2015-10-21 145 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); 

表包含什麼所有團隊和成員名稱作爲他們自己的條目。類型可以是「團隊」或「成員」。

爲了配合這個參與者表,我試圖創建一個交叉引用表,它允許一個成員通過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; 

,但我不確定如何進行。填充交叉引用表的正確方法是什麼?

+0

all_names中的主鍵在哪裏;你必須瞄準一個整數。 – Alexandros

+0

'project4 = all_names'和'artists = participants'? – Patrick

+0

什麼讓你在'belongs_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; 

成員是多個團隊的部分得到所有記錄了他們的會員資格的。