PostgreSQL - 从三个表中选择多个主键并作为外键插入到一个表中

时间:2018-01-08 11:02:29

标签: sql database postgresql

编辑:为模糊和困惑的例子道歉,我将编辑示例以使关系更清晰。

我有一个 COMPANY_RAWDATA 表,如下所示:

 com_name  |  com_number | com_category | com_status 
-----------+-------------+--------------+-------------
Starbucks  | Star0121    | Drinks       | Active
KFC        | KFC1122     | Fast food    | Active
MCD        | MCD0000     | Fast food    | Active
MB         | MB2202      | Fast food    | Active
Chatime    | Pizza99     | Drinks       | Liquidation

将原始数据归一化为四个表:

(1) COMPANY_DETAIL com_detail_id为PK

com_detail_id  | com_name  | com_number
---------------+-----------+------------
            1  | Starbucks | Star0121
            2  | KFC       | KFC1122
            3  | MCD       | MCD0000
            4  | MB        | MB2202
            5  | Chatime   | Pizza99

(2) COMPANY_CATEGORY 表格,com_category_id为PK

 com_category_id | com_category 
-----------------+--------------
               1 | Fast food    
               2 | Drinks       
               3 | Restaurant   

(3) COMPANY_STATUS 表格,com_status_id为PK

 com_status_id |    com_status   
---------------+-------------------
             1 | Active                    
             2 | Liquidation        
             3 | In Administration  

(4) COMPANY 表,com_id作为PK,其他列具有FK约束,它们彼此有关系。

com_id  |  com_detail_id | com_category_id | com_status_id 
--------+----------------+-----------------+---------------

从(1)到(4)中提到的所有主键都是用SERIAL声明的。

预期输出应为:

   com_id  |  com_detail_id | com_category_id | com_status_id 
-----------+----------------+-----------------+---------------
        1  |              1 |               2 |             1
        2  |              2 |               1 |             1
        3  |              3 |               1 |             1
        4  |              4 |               1 |             1
        5  |              5 |               2 |             2

要插入写入脚本的特定列的三个查询如下所示:

INSERT INTO company_rawdata (com_detail_id)
SELECT com_detail_id FROM company_detail AS detail, 
                          company_rawdata AS raw
WHERE detail.com_name   = rawdata.com_name
AND   detail.com_number = rawdata.com_number;

INSERT INTO company_rawdata (com_category_id)
SELECT com_category_id FROM company_category AS cat, 
                            company_rawdata AS raw
WHERE cat.com_category  = rawdata.com_category;

INSERT INTO company_rawdata (com_status_id)
SELECT com_status_id FROM company_status AS status, 
                          company_rawdata AS raw
WHERE status.com_status = rawdata.com_status;

我正在尝试编写一个查询,将三个 insert与select 查询结合起来,从三个不同的表中插入这些主键,这些表将值与原始数据匹配并插入到公司表中。

感谢你们能帮助解决我的问题。感谢您的时间和考虑。

1 个答案:

答案 0 :(得分:0)

根据您更新的详细信息我假设您正在寻找:

INSERT INTO company (com_detail_id, com_category_id, com_status_id)
SELECT com_detail_id, com_category_id, com_status_id
FROM company_rawdata 
JOIN company_detail ON detail.com_name = rawdata.com_name AND detail.com_number = rawdata.com_number
JOIN company_category ON cat.com_category = rawdata.com_category
JOIN company_status  ON status.com_status = rawdata.com_status
;
相关问题