在单个选择语句

时间:2016-02-04 22:10:34

标签: sql db2

我有一个类似于此的插入语句:

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中的每个结果行表示为此insert语句中的单行?

类似的东西(假设' 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'),    
);

我再次确定你可以制作两个不同的表,一个带有外键,一个带有日期,然后以某种方式组合它们,但要点是将相关数据全部放在同一行。

2 个答案:

答案 0 :(得分: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的{​​{1}}

答案 1 :(得分:0)

以下查询将适用于DB2 for i。

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