我有一个查询来插入多行,其中每行的两列数据保持不变。有没有什么方法可以编写优化的查询,而不是再次放置插入语句。
INSERT INTO public.shops(id, shop_id, tier_id)
VALUES
(uuid_generate_v1(),'8011',(SELECT ID FROM PUBLIC.BETTING_TIER WHERE NAME='Daily Million 6 - North Ire')),
(uuid_generate_v1(),'8012',(SELECT ID FROM PUBLIC.BETTING_TIER WHERE NAME='Daily Million 6 - North Ire')),
(uuid_generate_v1(),'8013',(SELECT ID FROM PUBLIC.BETTING_TIER WHERE NAME='Daily Million 6 - North Ire')),
(uuid_generate_v1(),'8014',(SELECT ID FROM PUBLIC.BETTING_TIER WHERE NAME='Daily Million 6 - North Ire')),
(uuid_generate_v1(),'8015',(SELECT ID FROM PUBLIC.BETTING_TIER WHERE NAME='Daily Million 6 - North Ire')),
以纯INSERT INTO ... SELECT
:的形式重新表述
INSERT INTO public.shops (id, shop_id, tier_id)
SELECT uuid_generate_v1(), t2.shop_id, t1.ID
FROM PUBLIC.BETTING_TIER t1
CROSS JOIN
(SELECT '8011' AS shop_id UNION ALL SELECT '8012' UNION ALL SELECT '8013'
UNION ALL '8014' UNION ALL '8015') t2
WHERE t1.NAME = 'Daily Million 6 - North Ire';
Tim的解决方案的一个替代方案是使用generate_series创建商店ID,以防它们是连续的:
INSERT INTO public.shops(id, shop_id, tier_id)
SELECT uuid_generate_v1(), i::text, b.id
FROM generate_series(8011,8015,1) i
CROSS JOIN betting_tier b
WHERE b.name = 'Daily Million 6 - North Ire';