2016-02-04 63 views
0

我有一個INSERT語句看起來類似於此:插入外鍵和數據在一個SELECT語句

insert into memberOf (pid, gid) 
select p.pid, g.gid 
from person as p, 
    group as g 
where (p.name, g.name) IN (
    ('person1','groupA'), 
    ('person2','groupA'), 
    ('person3','groupB'),  
); 

PID和gid相結合彌補了主鍵,每一個本身顯然是一個外鍵引用兩張不同的桌子;人和團體。 現在,表memberOf還包含兩個列:from和until,每個表示該人員或該組成員的時間表的日期。

有沒有什麼辦法可以在memberOf中將每條生成的行表示爲插入語句中的一行?與此類似

東西(只是假設「1970」的會被認爲是DATE類型的有效成員):

insert into memberOf (pid, gid, from, until) 
select p.pid, g.gid, DATE, DATE 
from person as p, 
    group as g 
where (p.name, g.name) IN (
    ('person1','groupA','1970','2000'), 
    ('person2','groupA','1970','2016'), 
    ('person3','groupB','1999','2005'),  
); 

了,我肯定可以讓兩個不同的表,一個與外鍵,一個與日期,然後以某種方式結合起來,但要點是要有相關的數據全部在同一行。

+0

你可能指的是一個記錄,其中person1是person1,group應該是groupA,dateFrom是1970,dateUntil是2000?這是單記錄嗎?如果是這樣,你可能不想使用IN,因爲它會給你來自groupA和groupB的所有人員,無論他們是person1,person2還是person3。它應該是具體的。 – bipartite

回答

0

爲什麼要將日期添加到WHERE子句?

這不是給你你想要的嗎?

insert into memberOf (pid, gid, from, until) 
select p.pid, g.gid, DATE, DATE 
from person as p, 
    group as g 
where (p.name, g.name) IN (
    ('person1','groupA'), 
    ('person2','groupA'), 
    ('person3','groupB'),  
); 

被插入的數據是不是從WHERE它從select p.pid, g.gid, DATE, DATE

0

下面的查詢對DB2將工作的我。

INSERT INTO 
    memberOf (pid, gid) 
SELECT 
    p.pid, g.gid 
FROM 
    TABLE(VALUES 
     ('person1','groupA'), 
     ('person2','groupA'), 
     ('person3','groupB') 
    ) AS t(person, group) 
INNER JOIN 
    person AS p ON p.name = t.person 
INNER JOIN 
    group AS g ON g.name = t.group