【发布时间】:2019-06-04 08:32:41
【问题描述】:
我有以下 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;
【问题讨论】:
-
请不要发布无效代码作为描述,它没有任何意义。特别是“如果条件则加入”。用文字来解释。给出为相关部分运行的代码。请在代码问题中提供minimal reproducible example--cut & paste & runnable code;具有期望和实际输出的示例输入(包括逐字错误消息);标签和明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)