Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres嵌套的左外部联接在数组_agg()中返回多个null_Sql_Postgresql_Join_Nosql Aggregation - Fatal编程技术网

Sql Postgres嵌套的左外部联接在数组_agg()中返回多个null

Sql Postgres嵌套的左外部联接在数组_agg()中返回多个null,sql,postgresql,join,nosql-aggregation,Sql,Postgresql,Join,Nosql Aggregation,我有两张桌子: SELECT * FROM clubs_place_rubrics; id | place_id | placerubric_id -------+----------+---------------- 20777 | 3626 | 7 (1 row) SELECT * FROM clubs_placerubric LIMIT 5; id | rubric ----+---------------

我有两张桌子:

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)的评分标准为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语法上犯了一个错误

在评估结果列表中,肯定不应该有超过一个空值。对于站点、电子邮件和所有其他没有任何值的行也是如此

如何解决这个问题


谢谢。

如果这些表格中有多个条目:

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
当多次加入时,将加入。聚合后,这些多行的空值将显示在聚合中

你能确认地点id在俱乐部地点电话、俱乐部地点电子邮件和俱乐部地点网站中没有重复吗


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

如果这些表中有多个条目:

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
当多次加入时,将加入。聚合后,这些多行的空值将显示在聚合中

你能确认地点id在俱乐部地点电话、俱乐部地点电子邮件和俱乐部地点网站中没有重复吗


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

这是有道理的,如果您的俱乐部位置中有2个以上的id,那么在您的示例中,它只将这些id与placeid 3626连接,所以其余的将为空SUSE
array\u agg(distinct rubric.rubric)
删除重复值。谢谢@Abelisto,您能快速解释一下为什么会发生这种情况吗?我对SQL一无所知。非常感谢。@kAldown如果您对SQL完全陌生,那么就不可能快速解释:)祝您好运。这是有道理的,如果您在club_位置上有两个以上的id,那么在您的示例中,它只会连接那些带有placeid 3626的id,所以剩下的将是nullsUse
array_agg(distinct rubric.rubric)
删除重复值。谢谢@Abelisto,您能快速解释一下为什么会发生这种情况吗?我对SQL一无所知。非常感谢。@kAldown如果您是SQL新手,那么很难快速解释:)祝您好运。