У меня есть следующий псевдо-запрос SQL (Impala), так как он не будет компилироваться таким образом. Интересная часть - последняя, где я хочу делать именно то, что вы можете прочитать.
Я хочу сделать LEFT JOIN, но в случае отсутствия соответствующего ProductId, я хочу использовать конкретный ProductId (который имеет значение NULL и предположим, что есть только один, но гарантирует его с помощью LIMIT 1) и выполнить соединение, подобное JOIN поэтому вышеприведенные условия в CASE-WHEN будут работать правильно.
Таким образом, в основном вопрос заключается в том, есть ли способ преобразовать этот синтаксически некорректный запрос в один правильный?
Я пробовал разные вещи, например, ISNULL () и WITH, но поскольку подзапрос, который вы видите в части ELSE, должен использовать 2 таблицы для правильной работы, он не может быть скомпилирован в любом случае, на мой взгляд, он будет работать.
SELECT
cd.CycleDataId AS CycleDataId,
CASE
WHEN cd.CycleTime >= op.IdealValue AND cd.CycleTime <= op.MaxValue THEN NVL(dcl.ProductionLossTypeId, -1)
WHEN cd.CycleTime >= op.IdealValue AND cd.CycleTime >= op.MaxValue THEN dcl.ProductionLossTypeId
END AS Verdikt,
CASE
WHEN cd.CycleTime >= op.IdealValue AND cd.CycleTime <= op.MaxValue THEN NVL(dcl.Time, cd.CycleTime - op.IdealValue)
WHEN cd.CycleTime >= op.IdealValue AND cd.CycleTime >= op.MaxValue THEN dcl.Time
END AS Time
FROM CycleData cd
LEFT JOIN DistributedCycleLosses dcl ON dcl.CycleDataId = cd.CycleDataId
CASE
WHEN IF EXISTS(SELECT * FROM Operation_parameter WHERE ProductId = cd.ProductId AND cd.Timestamp_ BETWEEN ValidFrom AND ValidTo) THEN LEFT JOIN Operation_parameter op ON op.ProductId = cd.ProductId AND cd.Timestamp_ BETWEEN op.ValidFrom AND op.ValidTo
ELSE (SELECT * FROM Operation_parameter WHERE ProductId IS NULL AND cd.Timestamp_ BETWEEN ValidFrom AND ValidTo LIMIT 1) AS op
END;