gpt4 book ai didi

sql - 如何使 SQL 查询中的重复自定义表达式可维护

转载 作者:行者123 更新时间:2023-12-02 06:47:23 27 4
gpt4 key购买 nike

想象一下下面的简单查询,其中我获得了最近 3 天内创建的所有用户的列表,逻辑或示例并不重要

SELECT
...
, DATEDIFF(DAY, U.DateCreated, GETUTCDATE())
...
FROM
dbo.AspNetUsers U
WHERE
DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3

我重复了一些代码 DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3其中,当我有上述更复杂的示例时,我不想维护两次或多次我需要该逻辑。

考虑到性能,应该如何处理这个问题?

谢谢

最佳答案

如果您考虑的是性能,那么最好在需要时重复表达式。具体来说,不要试图将它们放在用户定义的函数中。众所周知,它们会使 SQL Server 中的查询变慢。

话虽如此,SQL Server 中至少有两种方法可以在不影响性能的情况下提高查询的可读性:

  1. 专业技能考试
  2. 交叉应用

CTE 使用示例:

WITH
CTE
AS
(

SELECT
...
, DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) AS CalculatedColumn
...
FROM
dbo.AspNetUsers U

)
SELECT
...
CalculatedColumn
...
FROM CTE
WHERE
CalculatedColumn < 3
;

使用 CROSS APPLY 的示例:

而不是在以下查询中重复部分公式:

SELECT
ColA + ColB AS ColSum
,ColA - ColB AS ColDiff
,(ColA + ColB) * (ColA - ColB) AS Result
,(ColA + ColB) * (ColA - ColB) * 100.0 AS Percentage
FROM Table

你可以使用CROSS APPLY这样写:

SELECT
ColSum
,ColDiff
,Result
,Result * 100.0 AS Percentage
FROM
Table
CROSS APPLY
(
SELECT
ColA + ColB AS ColSum
,ColA - ColB AS ColDiff
) AS A1
CROSS APPLY
(
SELECT ColSum * ColDiff AS Result
) AS A2

顺便说一下性能,

WHERE DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3

很糟糕,因为它不能在 DateCreated 上使用索引(因为您将该列包装在一个函数中)。

你最好把它重写成类似的东西

WHERE U.DateCreated > DATEADD(DAY, -3, GETUTCDATE())

关于sql - 如何使 SQL 查询中的重复自定义表达式可维护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54993580/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com