如何在这个特定的 T-SQL 查询中使用表变量?
Posted
技术标签:
【中文标题】如何在这个特定的 T-SQL 查询中使用表变量?【英文标题】:How to use a Table Variable with this specific T-SQL query? 【发布时间】:2018-08-19 06:06:54 【问题描述】:我正在使用SQL Server 2012
,并且我有以下T-SQL
查询针对我数据库上的一个表运行。查询运行良好,但我的问题是我想获得几个特定日期的输出。而不是多次运行查询(通过每次更改@Date
变量的值),我希望它将@Date
值存储在某处并在我的查询中实现逻辑。我该怎么做?
我原来的查询如下:
DECLARE @Date date;
SET @Date = '20180630';
SELECT @Date, COUNT(*) AS Employees
FROM RavEmpID
WHERE DateOfEntry <= @Date
AND (DateLeft > @Date
OR DateLeft IS NULL);
从***
(SQL Server store multiple values in sql variable) 上的以下帖子中,我了解到我需要一个表变量来存储我需要的@Date
值。
所以,我在我的数据库上创建了一个表变量(称为TableVariable
)。
TableVariable
表只有一个名为 Date
的列,如下所示:
Date
2015-11-30
2015-12-31
2016-01-31
2016-02-29
...
我的新T-SQL
现在如下所示:
SELECT b.[Date], COUNT(*) AS Employees
FROM RavEmpID a
left join TableVariable b on b.[Date] = a.[DateLeft]
WHERE a.DateOfEntry <= b.[Date]
AND (a.DateLeft > b.[Date]
OR a.DateLeft IS NULL)
GROUP BY b.[Date]
运行此查询时,我的输出为零。我在这里做错了什么?
【问题讨论】:
我认为问题可能出在 JOIN 中,因为 TableVariable 中可能没有任何与 RavEmpID 表中的 DateLeft 匹配的日期。如果我删除 JOIN,我该如何解决这个问题? 【参考方案1】:您需要对查询进行一些更改:
将所有原始WHERE
条件移到ON
子句中
将日期表设为LEFT JOIN
中的第一个表,因为您想保留所有这些日期
更改 ``COUNT()` 以便计算匹配项
结果查询:
SELECT d.[Date], COUNT(r.DateOfEntry) AS Employees
FROM TableVariable d LEFT JOIN
RavEmpID r
ON r.DateOfEntry <= d.[Date] AND
(r.DateLeft > d.[Date] OR r.DateLeft IS NULL)
GROUP BY d.[Date]
GROUP BY d.[Date];
请注意,我还将表格别名从任意字母更改为表格名称的缩写。这使得查询更易于阅读。
【讨论】:
非常感谢!正是我需要的。我认为您需要将第一行中的 b.[Date] 更改为 d.[Date]。【参考方案2】:您的加入基于
b.[Date] = a.[DateLeft]
但是你的 where 子句是基于
a.DateLeft > b.[Date]
所以没有逻辑来获取记录。 试试这个:
SELECT b.[Date], COUNT(*) AS Employees
FROM RavEmpID a
inner join TableVariable b on b.[Date] = a.[DateLeft]
WHERE a.DateOfEntry <= b.[Date]
【讨论】:
它确实为我提供了 TableVariable 表中每个日期的输出,但数字不正确。事实上,我需要它来提供截至 TableVariable 表中日期的员工总数。例如,对于日期 2017-11-30,我需要尚未离开的员工总数。即:他们的 DateLeft 是 > 2017-11-30以上是关于如何在这个特定的 T-SQL 查询中使用表变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何查询一个oracle数据库中所有表的所有字段哪个包含特定字符串?