Оператор IN , использующий подзапрос, не работает в проекции, независимо от того, содержится ли он в CASE WHEN , он будет работать только в фильтрах.Это работает нормально, если вы указываете значения в предложении IN напрямую, а не используете подзапрос.
Я не уверен, как сгенерировать точное исключение, которое вы получили выше, но когда я пытаюсь запуститьПодобный запрос в Spark Scala возвращает более описательную ошибку:
org.apache.spark.sql.AnalysisException: IN/EXISTS predicate sub-queries can only be used in a Filter: Project [CASE WHEN agi_label#5 IN (list#96 []) THEN 1 ELSE 0 END AS CASE WHEN (agi_label IN (listquery())) THEN 1 ELSE 0 END#97]
Я сталкивался с этой проблемой в прошлом.Лучше всего, вероятно, реструктурировать его, чтобы использовать левое соединение с requiredProducts
, а затем проверить нулевое значение в выписке.Например, что-то вроде этого может работать:
SELECT COUNT(CASE WHEN rp.name is not null THEN mp.name END)
FROM myProducts mp
LEFT JOIN requiredProducts rp ON mp.name = rp.name