Не запустив этот код, вы присоединитесь к тому, что вы могли бы использовать CTE. Учитывая отсутствие сортировки, можно использовать b1
ANY_VALUE .
WITH inters AS (
SELECT cust
,ANY_VALUE(b1) AS b1
FROM AAA
WHERE ast IN ('A', 'T') AND uce = 'IN'
GROUP BY cust
)
SELECT a1 AS cut
,b1 AS serv
,c1 AS name
,d1
,e1 AS rep
,(SELECT COUNT(ACT2."B1") FROM AAA as ACT2 WHERE ACT2."AST" in ('A', 'T') and ACT2."UCE" = 'IN' and ACT2."CUST" = ACT."CUST") as NCount
,i.b1 AS INTER
FROM BBB
LEFT JOIN aaa AS act
ON wnb = act.b1
LEFT JOIN inters AS i
ON i.cust = act.cust
WHERE pcd IN ('PD', 'PD2')
AND pdt = 0
AND act.ast IN ('A', 'T')
, но первый суб-выбор использует ту же исходную таблицу и фильтры, что и секунды, так что это также может бытьперемещено в CTE как:
WITH inters AS (
SELECT cust
,ANY_VALUE(b1) AS b1
,COINT(b1) AS ncount
FROM AAA
WHERE ast IN ('A', 'T') AND uce = 'IN'
GROUP BY cust
)
SELECT a1 AS cut
,b1 AS serv
,c1 AS name
,d1
,e1 AS rep
,i.ncount
,i.b1 AS INTER
FROM BBB
LEFT JOIN aaa AS act
ON wnb = act.b1
LEFT JOIN inters AS i
ON i.cust = act.cust
WHERE pcd IN ('PD', 'PD2')
AND pdt = 0
AND act.ast IN ('A', 'T')
, что должно работать лучше, чем первый код.
в зависимости от размера таблицы aaa, может быть некоторое повышение производительности от добавления другого CTE, который фильтруетast IN ('A', 'T')
, который затем используется inters
CTE и основным SELECT, поскольку оба будут читать одну и ту же таблицу дважды. Но на этот аспект больше будет влиять объем ваших данных, который соответствует другим ограничениям.