我需要显示表格中的日期列表
SELECT mydate AS MyDate, 1 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;
Jan 1, 2010 - 1
Jan 2, 2010 - 1
Jan 10, 2010 - 1
没问题。但是,我现在需要使用不同的 DateType 显示之前和之后的日期。
Dec 31, 2009 - 2
Jan 1, 2010 - 1
Jan 2, 2010 - 1
Jan 3, 2010 - 2
Jan 9, 2010 - 2
Jan 10, 2010 - 1
Jan 11, 2010 - 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
但这包括原始日期的重复。
Dec 31, 2009 - 2
Jan 1, 2010 - 2
Jan 1, 2010 - 1
Jan 2, 2010 - 2
Jan 2, 2010 - 1
Jan 3, 2010 - 2
Jan 9, 2010 - 2
Jan 10, 2010 - 1
Jan 11, 2010 - 2
我怎样才能最好地删除这些重复项?我正在考虑使用临时表,但不确定这是否是最好的方法。
在我看来,这也可能会带来性能问题,因为我在三个不同的时间运行相同的查询。
处理此请求的最佳方式是什么?
最佳答案
这应该适合你:
SELECT MyDate, min(DateType) as 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 ALL
SELECT mydate AS MyDate, 1 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;
) AS myCombinedDateTable
group by MyDate
注意:我将第二个 UNION
更改为 UNION ALL
以获得更好的性能;最后一个子查询永远不会与前两个子查询重复,因为前两个子查询的 DateType
始终为 2,最后一个 UNION
ed 查询始终为 1。
关于SQL获取日期列表以及之前和之后的天数而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427333/