首页 > 解决方案 > with, 在第一个查询中有效,但在第二个查询中无效

问题描述

我有这个功能,检查第一次咨询中是否有结果,table_one 如果没有结果,检查 second_table

分开每个查询有效,但如果加入它,只处理第一句而不是第二句

CREATE OR REPLACE FUNCTION get_data(id INT)
    RETURNS TABLE(
      id INT,
      created_at TIMESTAMP,
      attempts INT,
      status VARCHAR
    )
    language plpgsql
AS
$$
DECLARE
    _SENT VARCHAR := 'SENT';
BEGIN
    RETURN QUERY
    WITH r AS (
      SELECT p_i.id, a_r.created_at, a_r.attempts,
        CASE a_r.status
          WHEN 'PENDING' THEN _SENT
        END AS status
      FROM table_one p_i
      LEFT JOIN (
        SELECT a_r.table_one_id, max(a_r.id) id
        FROM awa_req a_r
        GROUP BY a_r.table_one_id
      ) last_md on last_md.table_one_id = p_i.id
      LEFT JOIN awa_req a_r on a_r.table_one_id = last_md.table_one_id  and a_r.id = last_md.id
      WHERE p_i.user_id = $1
        AND p_i.deleted_at IS NULL
    )
    SELECT * FROM r
    UNION ALL
        SELECT p_i.id, m_d.created_at, m_d.attempts,
        CASE
            WHEN m_d.confirmed_at IS NULL THEN _SENT
        END AS status
        FROM pay_ins p_i
        LEFT JOIN (
            SELECT max(t.id) AS id, t.pay_ins_id
                FROM table_two t
                GROUP BY t.pay_ins_id
        ) last_md on last_md.pay_ins_id = p_i.id
        LEFT JOIN table_two m_d on m_d.pay_ins_id = last_md.pay_ins_id and m_d.id = last_md.id
            AND NOT EXISTS (
                SELECT * FROM r
            );
END;
$$;

最好的

标签: sqlpostgresqlstored-procedures

解决方案


如果 r 中存在任何行,这部分将删除 UNION 子句中的所有行:

AND NOT EXISTS (
                SELECT * FROM r
            );

它应该是这样的:

AND NOT EXISTS (
    SELECT FROM r WHERE r.id = p_i.id
)

推荐阅读