如何在这个特定的 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数据库中所有表的所有字段哪个包含特定字符串?

T-SQL 之 表变量和临时表

T-SQL - 如何编写条件连接

如何为客户特定数据使用通用变量

用于从连接表中进行选择的 T-SQL 查询,其中有可变数量的参数?

如何一次查询有限行中的 T-SQL 表