当前位置: 首页 > 面试题库 >

通过使用CTE简化SQL语句

庄欣然
2023-03-14
问题内容

我有一个类似以下的查询:

SELECT A.a, A.b, B.c,
(CASE WHEN ... THEN ... ELSE ... END) AS CalculatedValue,
B.d
FROM    dbo.TableA A INNER JOIN
        dbo.TableB B ON (...)
WHERE (CASE WHEN ... THEN ... ELSE ... END) BETWEEN @DayStart AND @DayEnd
GROUP BY A.a, (CASE WHEN ... THEN ... ELSE ... END), B.c

为了避免多次重复相同的表达式:(CASE WHEN ... THEN ... ELSE ... END)我想定义一个CTE,并在select,where和group by表达式中使用查询该表CalculatedValue

不幸的是,这不起作用,因为group by在创建CTE

还有什么其他方法可以使我不重复CASE WHEN...这么多次?


问题答案:

使用CROSS APPLY,可用于定义别名字段,然后引用它们:

SELECT A.a, 
       A.b, 
       B.c,
       CalculatedValue,
       B.d
FROM    
       dbo.TableA A 
INNER JOIN
        dbo.TableB B 
        ON (...)
CROSS APPLY 
        (SELECT (CASE WHEN ... THEN ... ELSE ... END)) CxA(CalculatedValue)
WHERE CalculatedValue BETWEEN @DayStart AND @DayEnd
GROUP BY A.a, CalculatedValue, B.c

CxA仅仅是一个别名,不管你喜欢,你可以将其命名。



 类似资料:
  • 问题内容: 在SQL中是否可以在同一查询的另一个CTE内的Common Table Expression内使用引用?这里有一个例子: 我在SQLite3中尝试了此方法,并且它起作用了,我只是想知道它是否是标准SQL的一部分。关于此论点的任何建议将不胜感激。非常感谢你! 问题答案: 这是CTE的三个重要属性: 您可以在后续的CTE中或查询的主体中引用CTE。 您可以多次引用任何给定的CTE。 CTE

  • 问题内容: 我有以下代码清单 我正在尝试使用CTE将它们展平为一行。我有一个使用RowNumber函数执行此操作的CTE解决方案。 但是,我想知道是否可以不使用RowNumber函数而仍然使用CTE来做到这一点。所以我有以下内容-我认为更简单的内容-SQL 现在,它可以最大限度地利用递归并生成类似笛卡尔联接的东西-如果还不算更糟的话! 我希望尝试使用固定的“ JoinItem”每次将其加入锚记录

  • 问题内容: 是否允许在SQL CTE语句中执行存储过程?我对sql cte查询有点陌生… 问题答案: 不,对不起 仅SELECT语句 如果您需要使用存储的proc输出(结果集),那么它将是一个临时表

  • 如何使用Optional.ofNullable()、lambda表达式等简化下面的代码: 我试着做了以下几点: 使用,然后映射,然后筛选表达式,但我在如何返回节的问题上遇到了困难。

  • 问题内容: 我正在尝试执行我认为使用CTE进行递归比较困难的事情是SQL Server 2008。 在下面的示例中,您可以假设固定深度为3 …没有任何比这更低的深度了。在现实生活中,深度是“更深的”,但仍然是固定的。在示例中,我尝试将其简化一些。 我的输入数据如下。 我的CTE的输出应为下表。 如果我可以在输出中获得ID列,则可以肯定地可以映射到查找表中的名称。 我也乐于接受其他方法来完成此任务,

  • 问题内容: 我正在尝试创建一个论坛设置,您可以在其中对特定帖子发表评论,并将回复按日期顺序显示在父项的正下方。父级下面只有一个子级别。这是示例数据集: 这就是我想要最终得到的: 我知道我需要某种CTE,但这不会在适当的父项下对子项进行排序(显然,因为没有ORDER BY子句);我不知道正确的顺序。谁能提供一些见识? 问题答案: 对于单个级别的深度,您无需使用递归-尝试: