【问题标题】:postgres aggregate not showing rows where LEFT JOIN table has nullspostgres 聚合未显示 LEFT JOIN 表具有空值的行
【发布时间】:2013-08-13 15:50:12
【问题描述】:

我有一个表格,其中列出了为成员发送的电子邮件,并且有一个布尔值 is_selected。这个想法是只应该选择一个。我使用 is_selected 上的 where 子句将表连接到自身。我想要

string_agg(u.email, ',')

在视图的一列/行中显示所有未选择的电子邮件。

Here is a fiddle

我的问题是,在没有未选择的条目的情况下,我无法让视图工作。

sql fiddle 今天有问题,所以:

CREATE TABLE member_email
  (
    member integer NOT NULL, -- reference to another table
    email character varying(150) NOT NULL,
    is_selected boolean NOT NULL,
    PRIMARY KEY(member,email)
  );

INSERT INTO member_email 
    (member,email,is_selected) 
    VALUES 
        (2,'dax@example.com',TRUE),
        (2,'oldemail@example.com',FALSE),
        (2,'prevemail@example.com',FALSE),
        (3,'rick@example.com',TRUE),
        (3,'richard@example.com',FALSE),
        (4,'bob@example.com',TRUE);

CREATE VIEW v_member_email AS 
    SELECT s.member
    ,s.email as selected_email
    ,string_agg(u.email, ',') as unselected_email 
    FROM member_email s 
    LEFT JOIN member_email u 
        ON s.member = u.member 
    WHERE s.is_selected = TRUE 
        AND u.is_selected = FALSE 
    GROUP BY s.member,s.email 
    ORDER BY member;

SELECT * FROM v_member_email;

-- where is bob@example.com in result?

【问题讨论】:

  • ... AND u.is_selected = FALSE ... 。由于您正在测试左连接 u 表中的属性,因此左连接有效地降级为普通连接。您可以改用 ` ... AND u.is_selected IS DISTINCT FROM True ...`。

标签: postgresql null aggregate string-aggregation


【解决方案1】:

SQL Fiddle

如果右侧的条件放在where 子句中,则将left join 转换为inner join。只需将其移至连接条件即可:

select
    s.member
    ,s.email as selected_email
    ,string_agg(u.email, ',') as unselected_email 
from
    member_email s 
    left join
    member_email u on
        s.member = u.member
        and not u.is_selected
where s.is_selected
group by s.member,s.email 
order by member;

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多