我需要显示一张表中的日期列表
SELECT mydate AS MyDate, 1 AS DateType FROM myTable WHERE myTable.fkId = @MyFkId;
2010年1月1日-2010年1 月2日-2010年1 月10日-1
没问题。但是,我现在需要使用不同的DateType显示之前的日期和之后的日期。
2009年12月31日- 2010年1月1日-2010年1 月2日-2010年1 月3日- 2010年1月2日- 2010年1月2日- 2010年1 月10日-2010年1 月11日-2
我以为我可以用工会
SELECT MyDate, DateType FROM ( SELECT mydate - 1 AS MyDate, 2 AS DateType FROM myTable WHERE myTable.fkId = @MyFkId; UNION SELECT mydate + 1 AS MyDate, 2 AS DateType FROM myTable WHERE myTable.fkId = @MyFkId; UNION SELECT mydate AS MyDate, 1 AS DateType FROM myTable WHERE myTable.fkId = @MyFkId; ) AS myCombinedDateTable
但是,这包括原始日期的副本。
2009年12月31日- 2010年1 月1日-2010年1 月2日- 2010年1月2日- 2010年1月2日- 2010年1 月3日- 2010年1月2日- 2010年1月2日- 2010年1月 2 日- 11月1日,2010-2
如何最好地删除这些重复项?我正在考虑使用临时表,但是不确定这是否是最好的方法。
在我看来,这可能会带来性能问题,因为我在三个不同的时间运行相同的查询。
处理此请求的最佳方法是什么?
尽管您已经接受了该解决方案,但让我将此解决方案作为参考:
SELECT MyDate, Min(DateType) From ( SELECT MyDate + T1.RecordType AS MyDate, T1.DateType FROM ( Select 1 AS RecordType, 2 AS DateType Union ALL Select 0 AS RecordType, 1 AS DateType Union ALL Select -1 AS RecordType, 2 AS DateType ) AS T1 CROSS JOIN myTable Where myTable.fkId = @MyFkId ) AS CombinedTable Group By MyDate
此解决方案的优势在于,仅查询一次myTable,在当前情况下,我们对fkID进行了过滤,因此现在的性能将无关紧要,但是,如果我们必须评估复杂的查询,则该技术就Union而言可以很好地工作。