与,适用于第一个查询,但不适用于第二个查询

时间:2020-10-30 14:07:11

标签: sql postgresql stored-procedures

我有此功能,用于检查第一次咨询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;
$$;

最好

1 个答案:

答案 0 :(得分:0)

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

AND NOT EXISTS (
                SELECT * FROM r
            );

它应该类似于:

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