gpt4 book ai didi

sql - Postgres 嵌套的 LEFT OUTER JOIN 在 array_agg() 中返回多个 null

转载 作者:行者123 更新时间:2023-11-29 13:54:22 24 4
gpt4 key购买 nike

我有两张 table :

SELECT * FROM clubs_place_rubrics;
id | place_id | placerubric_id
-------+----------+----------------
20777 | 3626 | 7
(1 row)

SELECT * FROM clubs_placerubric LIMIT 5;
id | rubric
----+------------------------
1 | Тренажёрные залы
2 | Фитнес-клубы
3 | Косметические услуги
4 | Услуги массажиста
5 | Ледовые дворцы / Катки

所以有些俱乐部有或根本没有规则。从上面的例子中,只有一个俱乐部 (id=3626) 有 rubric#7。

那么为什么这段代码返回空值列表,不止一个空值?

        SELECT
place.id, place.title,
array_agg(phone.code) phone_code,
array_agg(phone.phone) phone_number,
array_agg(phone.fax) fax,
array_agg(email.email) email,
array_agg(site.site) site,
array_agg(rubric.rubric) rubrics
FROM clubs_place place
LEFT OUTER JOIN clubs_placephone phone
ON place.id = phone.place_id
LEFT OUTER JOIN clubs_placeemail email
ON place.id = email.place_id
LEFT OUTER JOIN clubs_placesite site
ON place.id = site.place_id
LEFT OUTER JOIN clubs_place_rubrics rubrics
ON place.id = rubrics.place_id
LEFT OUTER JOIN clubs_placerubric rubric
ON rubric.id = rubrics.placerubric_id

WHERE project='Москва'
GROUP BY place.id
LIMIT 6;


-[ RECORD 4 ]+-----------------------------------------------------------------------
id | 3629
title | Переделкино, банно-оздоровительный комплекс
phone_code | {499,495}
phone_number | {7379358,7311313}
fax | {t,t}
email | {gup@gup-bok.ru,gup@gup-bok.ru}
site | {www.gup-bok.ru,www.gup-bok.ru}
rubrics | {NULL,NULL}
-[ RECORD 5 ]+-----------------------------------------------------------------------
id | 3630
title | Досуг и здоровье, физкультурно-оздоровительный комплекс
phone_code | {499}
phone_number | {1281877}
fax | {f}
email | {""}
site | {www.apollon.ru}
rubrics | {NULL}
-[ RECORD 6 ]+-----------------------------------------------------------------------
id | 3631
title | Центр Корона, спортивно-развлекательный центр
phone_code | {495,495,495}
phone_number | {7532650,7540511,7941880}
fax | {f,f,f}
email | {centr-corona@yandex.ru,centr-corona@yandex.ru,centr-corona@yandex.ru}
site | {"","",""}
rubrics | {NULL,NULL,NULL}

似乎标题的数量与电话的数量相同。但是没有逻辑。我想,我在 SQL 语法上犯了错误。

在rubrics的结果列表中绝对不能有超过一个null。网站、电子邮件和所有其他行都一样,没有任何值(value)。

如何解决这个问题?

谢谢。

最佳答案

如果这些表中的任何一个有多个条目:

LEFT OUTER JOIN clubs_placephone phone 
ON place.id = phone.place_id
LEFT OUTER JOIN clubs_placeemail email
ON place.id = email.place_id
LEFT OUTER JOIN clubs_placesite site
ON place.id = site.place_id

然后你会有多个地点记录,而你的

LEFT OUTER JOIN clubs_place_rubrics rubrics
ON place.id = rubrics.place_id

多次加入时加入。聚合后,这些多行的 NULL 将显示在聚合中。

您能否确认 place_id 在以下任何一个中都不重复:clubs_placephone、clubs_placeemail 和 clubs_placesite?

如果存在重复,那么您可能希望使用子查询使这些连接一对一以避免重复。

关于sql - Postgres 嵌套的 LEFT OUTER JOIN 在 array_agg() 中返回多个 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35096112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com