编辑:为模糊和困惑的例子道歉,我将编辑示例以使关系更清晰。
我有一个 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 查询结合起来,从三个不同的表中插入这些主键,这些表将值与原始数据匹配并插入到公司表中。
感谢你们能帮助解决我的问题。感谢您的时间和考虑。
答案 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
;