使用另一个表中的PK在数据库表中插入多个记录

时间:2016-08-08 19:53:04

标签: sql database db2

我有DB2表“organization”,它包含组织数据,包括以下列

organization_id (PK), name, description

有些组织被删除,因此很多“organization_id”(即行)不再存在,所以它不像1,2,3,4,5那样连续......但更像是1,2 ,5,7,11,12,21 ....

然后还有另一个表格“title”以及其他一些数据,其中organization_id表格中organizationFK

现在我必须为所有组织插入一些数据,一些标题将在Web应用程序中显示给所有组织。 总共有大约3000条记录要添加。

如果我一个接一个地做,它会是这样的:

INSERT INTO title 
(
    name, 
    organization_id, 
    datetime_added, 
    added_by, 
    special_fl, 
    title_type_id
) 
VALUES 
(
     'This is new title', 
     XXXX, 
     CURRENT TIMESTAMP, 
     1, 
     1, 
     1
);

其中XXXX表示“organization_id”,我应该从表“organization”获取,以便插入只对现有的organization_id执行。 因此,只有“organization_id”正在更改与“organization_id”表格中的“organization”匹配。

最好的方法是什么? 我检查了几个类似的问题,但它们似乎都不等于此? SQL Server 2008 Insert with WHILE LOOP 虽然循环答案会对连续ID进行交互,但其他答案也会假定ID是自动增量的。

同样在这里: How to use a SQL for loop to insert rows into database?

对此不确定(因为问题本身并不十分清楚) Inserting a multiple records in a table with while loop

对此有何建议?我该怎么办?

1 个答案:

答案 0 :(得分:1)

如果您真的想要在Title中为每个组织记录添加一行,并且完全相同的数据应该可以正常工作:

INSERT INTO title 
(
    name, 
    organization_id, 
    datetime_added, 
    added_by, 
    special_fl, 
    title_type_id
) 
SELECT 
    'This is new title' as name, 
    o.organization_id,
    CURRENT TIMESTAMP as datetime_added, 
    1 as added_by, 
    1 as special_fl, 
    1 as title_type_id
FROM
    organizations o
;

你不应该在select中使用列别名,但我包含了可读性和良好的度量。 https://www.ibm.com/support/knowledgecenter/ssw_i5_54/sqlp/rbafymultrow.htm

并且如果您处理错误或其他任何事情,可以采取良好措施......如果该organization_id和title不存在,您也可以执行类似的操作,仅在标题中插入记录。

INSERT INTO title 
(
    name, 
    organization_id, 
    datetime_added, 
    added_by, 
    special_fl, 
    title_type_id
) 
SELECT 
    'This is new title' as name, 
    o.organization_id,
    CURRENT TIMESTAMP as datetime_added, 
    1 as added_by, 
    1 as special_fl, 
    1 as title_type_id
FROM
    organizations o
    LEFT JOIN Title t
    ON o.organization_id = t.organization_id
    AND t.name = 'This is new title'
WHERE
    t.organization_id IS NULL
;