首页 > 解决方案 > 如何在 with 子句中使用 max 来获取单个值并在主查询中使用该值进行空检查

问题描述

我无法写这个,请帮助。下面将给出我想要实现的目标。

WITH monthly_data AS
  (SELECT MAX(some_date) latest_dt FROM monthly_data
  )
SELECT SUM(data)
FROM daily_data
WHERE (monthly_data.latest_dt IS NULL
OR daily_data.some_date      > monthly_data.latest_dt)

表:monthly_data

id     some_date
007    08-MAY-2018

表:daily_data some_date 数据

07-MAY-2018     1
08-MAY-2018     1
09-MAY-2018     1

预期结果

Case 1: 1 row exist in table monthly_data.
Query should return 1.

Case 2: No rows exist in table montly_data.
Query should return 3.

上述查询中的连接不正确,但基本上是为了让您了解我正在尝试做的事情。另外,当我说表monthly_data 中不存在行时,这是简化的解释。实际查询中还有其他条件过滤掉数据。

这必须进入一个程序

编辑 感谢@D-Shih,我通过使用他提供的exist 子句查询开始处于一个更好的位置。

在性能方面,我们可以以更快的方式编写它吗?我相信可以评估到下面的东西是最快的

WITH CTE AS
  ( SELECT MAX(some_date) latest_dt FROM monthly_data
  )
SELECT SUM(d.some_data)
FROM daily_data d
WHERE (d.some_date > '08-MAY-2018'
OR '08-MAY-2018'  IS NULL)

标签: sqloracle

解决方案


如果我理解正确。我认为这会奏效。

由于您没有提供一些示例数据和预期结果。如果这不是您的预期结果,您可以提供一些示例数据和预期结果,我将编辑我的答案。

WITH CTE AS (
    SELECT Max(some_date) latest_dt 
    FROM   monthly_data
) 
SELECT Sum(d.data) 
FROM   daily_data d
WHERE Exists (
    SELECT 1 
    FROM CTE c
    WHERE  
        d.some_date > c.latest_dt 
    OR 
        c.latest_dt IS NULL 
)

编辑

您可以尝试在CTE桌子 JOIN上使用daily_data桌子

WITH CTE AS (
    SELECT Max(some_date) latest_dt 
    FROM   monthly_data
) 
SELECT SUM(d.data)
FROM CTE c JOIN  daily_data d
ON  d.some_date > c.latest_dt OR c.latest_dt IS NULL;

sqlfiddle:http ://sqlfiddle.com/#!4/33c64e/28


推荐阅读