gpt4 book ai didi

SQL 连接子查询问题/性能

转载 作者:行者123 更新时间:2023-11-29 14:25:59 25 4
gpt4 key购买 nike

有没有一种方法可以编写一个查询来获取与以下“虚构”查询相同的结果集?

CREATE OR REPLACE VIEW v_report AS
SELECT
meta.refnum AS refnum,
codes.svc_codes AS svc_codes
FROM
t_bill AS meta

JOIN (SELECT
string_agg(p.service_code, ':') AS svc_codes
FROM
t_bill_service_services AS p
WHERE
p.refnum = meta.refnum
) AS codes
ON meta.refnum = codes.refnum

这个查询是虚构的,因为它不会运行时出现关于 WHERE 子句中的 meta.refnum 无法从这部分引用的错误消息查询。

注 1:为简洁起见,省略了也已连接的各种其他表中的许多列。这可能会排除一些更简单的解决方案,这些解决方案消除了子查询。

注意 2:可以通过将 p.refnum 列添加到子查询并执行 GROUP BY p.refnum 来使这项工作(对于“工作”的某些定义) 并完全删除 WHERE,但这当然意味着整个 t_bill_service_services 表都会被扫描和排序——对于我的情况来说非常非常慢,因为该表是相当大。

(SQL 风格是 Postgres,但应该无关紧要,因为只有 string_agg() 调用应该是非标准 SQL。)

最佳答案

您可以将子查询放在查询的 SELECT 部分,而不是 JOIN 到派生表。在本节中,您可以在子查询中访问父表中的值,因此仅聚合其他表中的相关条目。例如:

select meta.refnum,
(SELECT string_agg(p.service_code, ':')
FROM t_bill_service_services AS p
WHERE p.refnum = meta.refnum
) AS svc_codes
from t_bill meta

Demo on dbfiddle

关于SQL 连接子查询问题/性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57940762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com