sql - 如何在 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)
解决方案
如果我理解正确。我认为这会奏效。
由于您没有提供一些示例数据和预期结果。如果这不是您的预期结果,您可以提供一些示例数据和预期结果,我将编辑我的答案。
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
推荐阅读
- asp.net - 当我尝试在 VB.Net 中使用 Text to Speech 时无法创建 ActiveX 组件
- angular - 我如何说服 typescript 可以在主题上调用 Observable 运算符?
- javascript - 如何在 d3.js 中制作带有扩展网格的圆角条形图?
- c# - 无法在 Linux 机器上为使用 MySQL db 和 Pomelo.EntityFrameworkCore.MySql 的 dot net core 2.1 应用程序运行 docker 映像
- python-3.x - Visual Studio Code Python 调试“发生异常 SystemExit”
- apache-spark - 多宿主 Spark 集群
- sql-server - 为什么现在发生参数嗅探,使得快速查询在 SSRS 中运行缓慢?
- java - 在 WebView Android 上实现后退按钮
- visual-studio - Visual Studio 2017 中的 Xamarin.iOS 项目为自动预配提供错误
- c# - 通过读取从实体框架生成的 DbContext 类来创建数据库