我正在使用Postgres 9.3。
我有两个表T1
以及它们之间T2
的n:m
关系T1_T2_rel
。现在,我想创建一个视图,该视图除了T1的列外,还为T1中的每个记录提供一列,其中包含一个包含T2所有相关记录的主键ID的数组。如果T2中没有相关条目,则此列的相应字段应包含空值。
我的架构的抽象版本如下所示:
CREATE TABLE T1 ( t1_id serial primary key, t1_data int );
CREATE TABLE T2 ( t2_id serial primary key );
CREATE TABLE T1_T2_rel (
t1_id int references T1( t1_id )
, t2_id int references T2( t2_id )
);
可以如下生成相应的样本数据:
INSERT INTO T1 (t1_data)
SELECT cast(random()*100 as int) FROM generate_series(0,9) c(i);
INSERT INTO T2 (t2_id) SELECT nextval('T2_t2_id_seq') FROM generate_series(0,99);
INSERT INTO T1_T2_rel
SELECT cast(random()*10 as int) % 10 + 1 as t1_id
, cast(random()*99+1 as int) as t2_id
FROM generate_series(0,99);
到目前为止,我提出了以下查询:
SELECT T1.t1_id, T1.t1_data, agg
FROM T1
LEFT JOIN LATERAL (
SELECT t1_id, array_agg(t2_id) as agg
FROM T1_T2_rel
WHERE t1_id=T1.t1_id
GROUP BY t1_id
) as temp ON temp.t1_id=T1.t1_id;
这行得通。但是,可以简化吗?
可以在此处找到相应的小提琴:sql-fiddle。不幸的是,sql-
fiddle不支持Postgres 9.3(尚未),这是横向联接所必需的。
[ 更新 ]正如已经指出的,left join
原则上简单地使用子查询就足够了。但是,如果我比较查询计划,则在使用a时使用left join
Post索引扫描时,Postgres将对聚合表采取顺序扫描left join lateral
。
正如@Denis已经评论过的:不需要LATERAL
。另外,您的子查询选择了错误的列。这有效:
SELECT t1.t1_id, t1.t1_data, t2_ids
FROM t1
LEFT JOIN (
SELECT t1_id, array_agg(t2_id) AS t2_ids
FROM t1_t2_rel
GROUP BY 1
) sub USING (t1_id);
-SQL提琴。
关于随后的顺序扫描,您提到:如果查询整个表,顺序扫描通常会 更快
。取决于运行的版本,硬件,基数和数据分布的设置和统计信息。WHERE
试用诸如WHERE t1.t1_id < 1000
或的选择子句,WHERE t1.t1_id = 1000
并与计划程序设置结合以了解选择:
SET enable_seqscan = off;
SET enable_indexscan = off;
重置:
RESET enable_seqscan;
RESET enable_indexscan;
当我添加一个左连接来获取外部表的计数时,它将我其他左连接表的总和值与计数相乘,我也不能在这里使用不同的总和,因为两个值可以是相同的:
本文向大家介绍说下左连接和右连接相关面试题,主要包含被问及说下左连接和右连接时的应答技巧和注意事项,需要的朋友参考一下 比如有两张表 A,B。左连接是把符合条件的所有A表的内容列出来,B表如果没有内容匹配用NULL代替。 右连接是符合条件的所有B表的内容列出来,A表如果没有内容匹配用NULL代替
问题内容: 我的表的详细信息字段中有两个以下JSON数组,并且需要像在另一个关系表中使用的那样评估查询。 我想对此JSON数组评估以下查询: 我使用了以下查询 和许多类似的查询,包括横向联接 : 但是,当通过交叉联接将其他字段(价格和日期)添加到查询中时,行数成倍增加。因此,我正在寻找要使用的新功能,但无法正确应用。如何在PostgreSQL中使用获得先前查询的结果?任何帮助,将不胜感激。 更新:
主要内容:Oracle LEFT JOIN子句简介,Oracle LEFT JOIN示例在本教程中,您将学习如何使用Oracle 子句来查询多个表中的数据。 Oracle LEFT JOIN子句简介 以下语句说明连接两个表和时的子句的语法: 在这个查询中,是左表,是右表。查询将表中的每一行与表中的行进行比较。如果和表中的一对行满足连接谓词,查询将组合两个表中行的列值,并将结果行记录包含在结果集中。 如果表中的行在表中没有找到匹配的行,则查询将会将SELECT子句中出现在表的每个列的值
LEFT OUTER JOIN 左外连接 [ ] 需求:查询所有分类,如果该分类下没有商品,则不显示该分类 [ ] 实现: SELECT `goods`.`id`, `goods`.`title`, `goods`.`price`, `goods`.`cate_id`, `cate`.`id`, `cate`, `cate.title` F
本文向大家介绍python实现图片横向和纵向拼接,包括了python实现图片横向和纵向拼接的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python实现图片横向和纵向拼接的具体代码,供大家参考,具体内容如下 直接上代码: 结果: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。