我有这个查询返回几行item_id
:
select item_id from properties where name like 'body';
我有第二个返回 1 行tag_id
:
select id from tags where name ilike '%hoax%';
我想使用这两个结果在第三个表中创建新行,item_tags
以便我可以将item_id
第一个查询中的每一个插入tag_id
第二个查询中。
我会有类似的东西:
INSERT INTO item_tags (item_id, tag_id) VALUES (item_id1, tag_id);
INSERT INTO item_tags (item_id, tag_id) VALUES (item_id2, tag_id);
INSERT INTO item_tags (item_id, tag_id) VALUES (item_id3, tag_id);
...
第一个查询返回 800 多行。如何自动化插入?
psql 9.1.11,Postgres 9.1.4。
基本的
INSERT
FROM 子句中的逗号 (
,
) 是 . 的简写CROSS JOIN
。这是建立在您的断言之上的,即第二个查询
tags
...您从 a 获得笛卡尔积
CROSS JOIN
,即 n*m 组合。如果连接的两边返回多于一行,则它们相乘。
如果任一方均未返回行,则总体结果为无行且没有任何反应。如果您不想要
这些效果,则一侧必须返回至少一行,而另一侧必须返回一行。
对于您的特定组合,您还可以使用嵌套子选择:
细微的差别:这会插入从 external 返回的所有行
SELECT
,即使 subselect ontags
没有返回任何行,这将被转换为NULL
fortag_id
。块
INSERT
要一次处理大量此类插入,您将使用经过大量修改的查询。但与上述第一个查询相同的规则适用于两个连接表中的基数。
你明白其中的逻辑吧?就个人而言,我称之为“
CROSS JOIN
代理”。