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

在同一查询中多次调用CTE

夹谷和韵
2023-03-14
问题内容

我有一个包含多个CTE的相当复杂的查询,但是其他人都从中提取了1个主要CTE,这是否会导致该主要CTE多次执行?


问题答案:

您可以这样使用CROSS JOIN:

SELECT 
    AVG(CASE WHEN instructorID = @instructorID THEN score END) InstructorSemesterAverage,
    STDEVP(CASE WHEN instructorID = @instructorID THEN score END) InstructorSemesterSTDeviation,
    AVG(CASE WHEN subjectCode = @subjectCode THEN score END) DepartmentSemesterAverage, 
    STDEVP(CASE WHEN subjectCode = @subjectCode THEN score END) DepartmentSemesterSTDeviation, 
    AVG(CASE WHEN bannerCRN=@CRN AND Q.year = @year AND semester = @semester THEN score END) ClassScore,
    STDEVP(CASE WHEN bannerCRN=@CRN AND Q.year = @year AND semester = @semester THEN score END) ClassSTDeviation,
    (SELECT DecTile FROM cteNtile WHERE instructorID = @instructorID)*10 DecTile,
    X.DepartmentClassFiveYearAverage AS DepartmentClassFiveYearAverage,
    X.DepartmentClassFiveYearSTDeviation AS DepartmentClassFiveYearSTDeviation,
    X.InstructorClassFiveYearAverage AS InstructorClassFiveYearAverage,
    X.InstructorClassFiveYearSTDeviation AS InstructorClassFiveYearSTDeviation
FROM 
    cteMain Q CROSS JOIN cteFiveYear X

这将防止的多次执行(有关实际执行计划,请参见Number of Executions属性)cteFiveYear

示例:如果执行此查询

SELECT  h.ProductID,h.StandardCost,
        x.AvgPrice
FROM    Production.ProductCostHistory h
CROSS JOIN (
    SELECT  AVG(p.ListPrice) AvgPrice
    FROM    Production.Product p
) x

使用AdventureWorks2008R2数据库,那么实际的执行计划将是
在此处输入图片说明



 类似资料:
  • 当尝试将Mockito与spring一起使用时,通过bean声明创建Mock对象... ...我在调用mockito时发现了一些奇怪的行为。当多次没有重置Mock对象时,例如: 在测试过程中(在同一个模拟上)多次调用此代码(“mockito.when”)时,测试就会失败并出现错误(BadSqlGrammerException即使该异常实际上是预期的--如果不抛出异常,我会得到一个失败,并且手动抛出

  • 问题内容: 上面的语句返回3行。但是下面的语句仅返回2行。 我知道为什么会这样,但是有一种方法可以强制item_id 1返回两次? 我要退货的示例: id-> 1筹码€2.50 id-> 1筹码€2.50 id-> 2可口可乐€1.60 -------------------- 总计€6.60 问题答案: 您可以加入另一个表,例如 或者只是在您的应用程序中复制它们。 您实际上不需要做您所要的。

  • 问题内容: 当尝试通过Spring使用Mockito时,通过bean声明创建Mock对象… …我多次调用Mockito。时发现一些奇怪的行为,而没有重置Mock对象,例如: 一旦在测试期间(在同一模拟上)多次调用此代码(“ Mockito.when”),测试就会失败并显示错误(BadSqlGrammerException,即使实际上是预期的异常,我也会失败- 如果我不抛出异常,则手动抛出该异常就可

  • 我想通过JDBC向Oracle DB发送一个准备好的语句SQL查询,如下所示: 只有在我提供3次时才起作用,但我不想这样做,我更希望调整准备好的语句的SQL,以便只使用一个但将其应用于所有条件。类似于 但这种尝试似乎并不奏效。有没有办法在SQL字符串中多次使用一个准备好的语句参数? 在@selvin的善意建议之后,我为准备好的语句使用了以下SQL字符串: 然后,我得到错误“ORA-06550:第1

  • 我有一个关于查询对象两次的问题。我是说我有这样的情况: > - 后来在网站中,我把一个表单编辑一个实体。它就是上述实体之一。所以我查询这个实体的数据库(整体,而不是部分),并把它放在表单中。 问题是,如果我编辑其中一个实体,就不会再次查询它以获取所有字段,因为我以前已经查询过它。 你知道怎么解决这个问题吗?我不想查询选择框的完整实体。

  • 问题内容: 使用此代码,我无法多次运行插入查询。它仅询问ID和名称一次(如果counter中的值大于1)。 让我借助一个示例进行说明:- 假设我将值2放入。这样,它应该询问我两次ID和名称,但只询问一次,然后它将我为ID和名称输入的值复制到表中两次。 我怎样才能解决这个问题?如果不能,请提出替代代码,以解决我的问题。 问题答案: 当PL / SQL块被编译时( 而不是 正在执行中),替换变量和分别