sql - 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;
$$;
最好的
解决方案
如果 r 中存在任何行,这部分将删除 UNION 子句中的所有行:
AND NOT EXISTS (
SELECT * FROM r
);
它应该是这样的:
AND NOT EXISTS (
SELECT FROM r WHERE r.id = p_i.id
)
推荐阅读
- javascript - Nodejs如何安装.ttf字体文件?
- java - 如何将 log4j 每日日志轮换与基于文件大小的轮换和 maxbackup 结合起来?
- optimization - 如何缩短此代码或使其更高效?
- oauth - 找不到用于 Binance 登录的 OAuth 的 Client_id
- amazon-web-services - 无法在 ec2 CLI 上运行“aws configure”命令
- swift - 无法获得 WKWebView 的准确高度
- javascript - 如果某些或所有单词与 json 的键匹配,则在 json 中查找值
- javascript - 我正在尝试在 html 中添加一个 for 循环,?但 for 循环显示错误
- ios - 选择同一项目时,SwiftUI 三列导航布局未关闭
- css - 在播放前从嵌入的 youtube iframe 中的缩略图中隐藏“在 Youtube 上观看”