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

单个select语句中的多个cte,其中cte可以相互引用

卓致远
2023-03-14
问题内容

扩展以下问题(多重选择语句),我想知道是否可以执行以下操作:

WITH 
    cte1 as (
      SELECT * from cdr.Location
    ),
    cte2 as (
      SELECT * from cdr.Location
        WHERE cdr.Location.someField = cte1.SomeField
    )
select * from cte1 union select * from cte2

所以这里的重点是以下几行:

 WHERE cdr.Location.someField = cte1.SomeField

我在cte2中的哪里引用cte1?


问题答案:

是的,您可以在后续CTE中引用先前声明的CTE:

WITH cte1 as (
  SELECT t.* 
    FROM cdr.Location t),
     cte2 as (
  SELECT t.* 
    FROM cdr.Location t
    JOIN cte1 c1 ON c1.somefield = t.someField)
SELECT * 
  FROM cte1 
UNION 
SELECT * 
  FROM cte2

笔记

  1. 在cte1声明中加入cte2无效,因为该语句是自上而下执行的。
  2. 您可以根据需要使用JOINing来引用CTE,就像引用任何其他内联视图(它)或table / temp table / etc一样。

顺便说一句:尝试在将来树立更好的榜样-这对您和所有试图帮助您的SO社区其他成员都是有益的。



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

  • 问题内容: 我有这个,在设定的总数时我得到一个错误。为什么我不能多次访问CTE? 问题答案: A基本上是一次性视图。它只保留一个语句,然后自动消失。 您的选择包括: 重新定义第二次。从定义的末尾到您的之前,这就像复制粘贴一样简单。 将结果放入表格或变量中 将结果具体化为真实表并引用 稍微更改一下即可,只需从您的CTE: 。

  • 问题内容: 我有一个类似以下的查询: 为了避免多次重复相同的表达式:我想定义一个CTE,并在select,where和group by表达式中使用查询该表 不幸的是,这不起作用,因为在创建 还有什么其他方法可以使我不重复这么多次? 问题答案: 使用,可用于定义别名字段,然后引用它们: 该仅仅是一个别名,不管你喜欢,你可以将其命名。

  • 问题内容: 我有一个很长的查询,本质上是以下内容的扩展: 完成后,其中的where子句将有约40行。为了使此任务更容易,我希望做与以下类似的事情: 不幸的是,lease_id不是唯一字段,同一个suite_id可以有多个lease_id(因此,第二个查询不可用)。 鉴于此解决方案无法正常工作,是否有更好的方法来执行第一条更新语句? 问题答案: 您可以创建表类型并通过它传递值,如下所示: 如果您使用

  • 本文向大家介绍10个mysql中select语句的简单用法,包括了10个mysql中select语句的简单用法的使用技巧和注意事项,需要的朋友参考一下 1、select语句可以用回车分隔 2、批量查询数据 3、使用concat连接查询的结果 返回"1-article content" 4、使用locate 用法: select locate("hello","hello baby");返回1 不存

  • 问题内容: 在此系统中,我们存储产品,产品图像(产品可能有很多图像)和产品的默认图像。数据库: 如您所见,和,是循环参考。可以吗 问题答案: 不,那不行。表之间的循环引用是混乱的。请参阅这篇(已有十年的历史)文章:SQL By Design:循环参考 一些DBMS可以特别小心地处理这些问题,但是MySQL会遇到问题。 作为您的设计,第一选择是使两个FK之一为可空。这使您能够解决“鸡与蛋”问题(我应