如何使用max in with子句获取单个值,并使用null检查在主查询中使用此值

时间:2018-05-09 04:34:57

标签: sql oracle

我无法写这个,请帮忙。下面将介绍我正在努力实现的目标。

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.

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

这必须进入程序

修改 感谢@ D-Shih我处于一个更好的位置,我开始使用他提供的exists子句查询。

在性能方面,我们可以更快地编写它吗?我认为可以评估下面的东西是最快的

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)

2 个答案:

答案 0 :(得分:1)

如果我理解正确的话。我认为这将有效。

由于您没有提供一些样本数据并且期望结果。如果没有您期望的结果,您可以提供一些样本数据并期望结果,我将编辑我的答案。

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

上使用JOINdaily_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

答案 1 :(得分:0)

尝试

SELECT CASE WHEN SUM(CASE WHEN md.Sdate IS NOT NULL THEN 1 ELSE 0 END) > 0 THEN 
            SUM(CASE WHEN md.Sdate IS NOT NULL THEN 1 ELSE 0 END)
        ELSE 
            SUM(CASE WHEN md.Sdate IS NULL THEN 1 ELSE 0 END) 
        END cnt
FROM daily_data dd
LEFT JOIN monthly_data md ON md.Sdate = dd.Sdate
....... {other conditions}