现在我想将这样的笛卡尔积插入数据库表(每对作为一行).打算用每个对的默认值填充表,因此此时数据(即两组)不存在于数据库中.
任何想法如何用postgresql实现这一点?
编辑:
在Grzegorz Szpetkowski的回答的帮助下,我能够生成一个能够实现我想要实现的目标的查询,但它确实不是最漂亮的查询.假设我要插入集合{1,2,3}和{‘A’,’B’,’C’}的笛卡尔积.
INSERT INTO "Test"SELECT * FROM(SELECT 1 UNION SELECT 2 UNION SELECT 3) PCROSS JOIN(SELECT 'A' UNION SELECT 'B' UNION SELECT 'C') Q
有没有更好的方法来做到这一点?
编辑2:
接受的答案很好,但我找到了另一个版本,如果它变得更复杂可能是合适的:
CREATE TEMP table "Numbers" (ID integer) ON COMMIT DROP;CREATE TEMP table "Chars" (Char character varying) ON COMMIT DROP;INSERT INTO "Numbers" (ID) VALUES (1),(2),(3);INSERT INTO "Chars" (Char) VALUES ('A'),('B'),('C');INSERT INTO "Test"SELECT * FROM"Numbers"CROSS JOIN"Chars";解决方法 我不确定这是否真的能回答你的问题,但在Postgresql中有
CROSS JOIN
定义为: For every possible combination of rows from T1 and T2 (i.e.,a
Cartesian product),the joined table will contain a row consisting of
all columns in T1 followed by all columns in T2. If the tables have N
and M rows respectively,the joined table will have N * M rows.FROM T1 CROSS JOIN T2 is equivalent to FROM T1,T2. It is also
equivalent to FROM T1 INNER JOIN T2 ON TRUE (see below).
编辑:
一种方法是使用VALUES Lists(注意事实上你没有订单,使用ORDER BY子句来获得一些排序):
SELECT N AS number,L AS letter FROM (VALUES (1),(3)) a(N)CROSS JOIN (VALUES ('A'),('C')) b(L);
结果:
number | letter--------+-------- 1 | A 1 | B 1 | C 2 | A 2 | B 2 | C 3 | A 3 | B 3 | C(9 rows)
BTW:
对于更多数字,我认为使用generate_series
功能是可以的,例如:
SELECT n AS number,chr(ascii('A') + L - 1) AS letterFROM generate_serIEs(1,5) NCROSS JOIN generate_serIEs(1,5) LORDER BY N,L;
结果:
number | letter--------+-------- 1 | A 1 | B 1 | C 1 | D 1 | E 2 | A 2 | B 2 | C 2 | D 2 | E 3 | A 3 | B 3 | C 3 | D 3 | E 4 | A 4 | B 4 | C 4 | D 4 | E 5 | A 5 | B 5 | C 5 | D 5 | E(25 rows)总结
以上是内存溢出为你收集整理的Postgresql:插入两组或更多组的笛卡尔积全部内容,希望文章能够帮你解决Postgresql:插入两组或更多组的笛卡尔积所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)