ошибка "Неподдерживаемый тип подзапроса не может быть оценен" в снежинке - PullRequest
1 голос
/ 04 октября 2019

Я вижу следующую ошибку при запуске приведенного ниже кода.

Неподдерживаемый тип подзапроса не может быть оценен

Когда я комментирую третий оператор выбора и запускаю запрос, запрос выполняется с результатом. Эта ошибка появляется в последнем операторе select.

Могу ли я узнать, как поместить последний оператор выбора в мой запрос?

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
       ,(SELECT ACT2."B1" 
         FROM AAA as ACT2 
         WHERE ACT2."AST" in ('A', 'T') 
            and ACT2."UCE" = 'IN' 
            and ACT2."CUST" = ACT."CUST" 
         LIMIT 1) as INTER
FROM BBB
left outer join AAA as ACT 
   on "WNB" = ACT."B1" 
WHERE "PCD" in ('PD', 'PD2') 
   and "PDT" = 0 
   and ACT."AST" in ('A', 'T')

1 Ответ

1 голос
/ 05 октября 2019

Не запустив этот код, вы присоединитесь к тому, что вы могли бы использовать 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, поскольку оба будут читать одну и ту же таблицу дважды. Но на этот аспект больше будет влиять объем ваших данных, который соответствует другим ограничениям.

...