我目前有一个T-SQL查询,它会提取历史发票日期列表,并使用临时表来阻止第二个到最后一个发票日期。问题是,我需要在第三方应用程序的预处理器中使用此查询,该预处理器在使用创建和删除临时表时效果不佳。有没有办法在不使用View或Temp Table的情况下编写以下T-SQL查询?
SELECT (convert(CHAR(10), dateadd(dd, DateDiff(dd, 0, ltradat), 0), 126)) AS 'DateOnly'
INTO #temp
FROM matter WITH (NOLOCK)
,ledger WITH (NOLOCK)
WHERE mclient = '014134'
AND lmatter = mmatter
AND lzero != 'R'
AND mcurrency LIKE '%'
AND llcode != 'PAY'
GROUP BY ltradat
ORDER BY ltradat
SELECT max(DateOnly)
FROM #temp
WHERE DateOnly < (
SELECT max(DateOnly)
FROM #Temp
)
DROP TABLE #temp
#Temp表格列出了发票日期和与这些发票相关的事项。 select会从列表中将单个发票日期减去1(从最早到最新排序)。
如果我从#Temp中选择*,我会得到一个如下列表:
2016-06-08
2016-07-12
2016-07-26
2016-08-05
2016-09-12
当我运行T-SQL查询的最后一部分时,我得到了我需要的结果:
2016-08-05
是否可以从没有TEMP表或VIEW的单个查询中获取此结果?
提前谢谢。
-Nick
答案 0 :(得分:1)
您可以使用子查询而不是临时表或视图来获取第二个最新日期吗?像
SELECT MAX(DateOnly)
FROM (
SELECT TOP 2 (convert(CHAR(10), dateadd(dd, DateDiff(dd, 0, ltradat), 0), 126)) AS DateOnly
FROM matter WITH (NOLOCK)
,ledger WITH (NOLOCK)
WHERE mclient = '014134'
AND lmatter = mmatter
AND lzero != 'R'
AND mcurrency LIKE '%'
AND llcode != 'PAY'
GROUP BY ltradat
ORDER BY ltradat
) AS b