【发布时间】:2018-08-25 14:37:27
【问题描述】:
我正在尝试编写一个 sql 脚本,它从列表中返回一个项目,如果该项目可以在列表中找到,如果没有,它返回最近添加到列表中的项目。我想出了一个使用 count 和 if-else 语句的解决方案。但是我的表有非常频繁的 I/O 操作,我认为这个解决方案效率低下。有没有人可以优化此解决方案或更好的方法。
这是我的解决方案:
DECLARE @result_set INT
SET @result_set = (
SELECT COUNT(*) FROM
( SELECT *
FROM notification p
WHERE p.code = @code
AND p.reference = @reference
AND p.response ='00'
) x
)
IF(@result_set > 0)
BEGIN
SELECT *
FROM notification p
WHERE p.code = @code
AND p.reference = @reference
AND p.response ='00'
END
ELSE
BEGIN
SELECT
TOP 1 p.*
FROM notification p (nolock)
WHERE p.code = @code
AND p.reference = @reference
ORDER BY p.id DESC
END
我也认为应该有办法绕过重复这个选择语句:
SELECT *
FROM notification p
WHERE p.code = @code
AND p.reference = @reference
AND p.response ='00'
我只是不够精通 SQL,无法弄清楚。
【问题讨论】:
-
我不明白您的代码中的任何内容与“最新”有何关系。
-
在“else”语句中,当结果按 id 降序排列时,它返回第一个条目。最大的 id 通常是表中的最新条目,或者该结果集中的最新条目
标签: sql sql-server io query-performance sqlperformance