gpt4 book ai didi

sql - 如何选择Sql Server中不存在的记录

转载 作者:行者123 更新时间:2023-12-01 09:57:55 27 4
gpt4 key购买 nike

这与在选择记录之前检查记录是否存在无关,反之亦然。

问题是这样的,我有一个有很多记录的数据库,它们是按日期存储的,具体来说是按天存储的,每天应该有一组值,但有些天可能根本没有任何值,它们可能不存在。因此,当我尝试进行查询时,我需要显示所有数据,即使它在技术上不存在,它至少可以显示为空白,但它应该显示。

想想这张表:

 ___________________________________
| id | date | value1 | value2 |
| 1 | 02/01/2014 | 1 | 1 |
| 2 | 02/03/2014 | 2 | 2 |
| 3 | 02/04/2014 | 3 | 3 |
| 4 | 02/06/2014 | 4 | 4 |

现在查询需要做的是返回特定日期范围内的所有数据,比如从 02/01/201402/03/2014,它应该返回该日期范围内的所有值,例如:

SELECT * FROM myTable WHERE date>=`02/01/2014` AND date<=`02/03/2014`

但这只会返回:

 ___________________________________
| id | date | value1 | value2 |
| 1 | 02/01/2014 | 1 | 1 |
| 2 | 02/03/2014 | 2 | 2 |

现在我知道这很明显,它是根据我发送给查询的范围选择表中存在的所有数据,但我正在处理一个不关心是否有值的报告无论是否给定一天,它必须每天返回,即使那天有记录或没有,这意味着即使 02/02/2014 不在表上,它也必须返回

有点像这样:

 ___________________________________
| id | date | value1 | value2 |
| 1 | 02/01/2014 | 1 | 1 |
| | 02/02/2014 | | |
| 2 | 02/03/2014 | 2 | 2 |

没有数据没关系,只是不能让这一天好像没有发生一样。

我已经尝试使用 COALESCEISNULL,但是由于那些日子没有值,所以也没有空值,所以它们根本无法替换 Null 和其他东西。

有没有人有什么想法?

最佳答案

你可以用递归 CTE 来做到这一点.像这样:

DECLARE @startDate datetime = '2/1/2014'
DECLARE @endDate datetime = '2/6/2014'

;WITH DateRange(RunningDate) AS
(
SELECT @startDate AS RunningDate
UNION ALL
SELECT RunningDate + 1
FROM DateRange
WHERE RunningDate < @endDate
)

SELECT id, RunningDate date, value1, value2
FROM DateRange LEFT JOIN myTable ON myTable.date = DateRange.RunningDate

编辑... 如果您确实采用此解决方案(请注意 Aaron Bertrand 在我的回答下的评论),请注意您还必须指定 max recursion如果您打算处理大于 3 个月的范围。默认设置为 100。这意味着,在当前编写查询时,它最多只会执行 101 个日期(100 级递归)。

您可以在最后一个 SELECT 的末尾额外指定 OPTION (MAXRECURSION 0) 来解决这个问题。 0 表示无限级递归。但同样,请注意 Aaron 的帖子。

关于sql - 如何选择Sql Server中不存在的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21691426/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com