使用现有表名的WITH子句是否有效?

gga*_*tta 3 mysql sqlite query cte temporary-tables

假设我有一张桌子Entry。在查询期间WITH替换表的子句是否有效?Entry我尝试使用 SQLite 和 MySql,它似乎可以工作,但我想在应用程序中使用它之前确定这是有意的。

让我添加一些细节。假设我有一个表Entry和另一个表Thing,以及这样的查询

SELECT Entry.k, Entry.v, Thing.v2
FROM Entry INNER JOIN Thing ON Entry.v = Thing.k
Run Code Online (Sandbox Code Playgroud)

以下内容有效吗?

WITH Entry AS (SELECT 1 AS k, 1234 AS v)
SELECT Entry.k, Entry.v, Thing.v2
FROM Entry INNER JOIN Thing ON Entry.v = Thing.k
Run Code Online (Sandbox Code Playgroud)

这似乎符合我的要求,但是我可以指望这种行为不是错误或未定义的行为吗?在 SQLite 或 MySQL 的文档中找不到任何明确允许或禁止它的内容。

(我知道在这个特定的例子中我可以SELECT ... FROM Thing WHERE ...。这不是这个问题的重点 - 请相信我,我有充分的理由编写我正在编写的查询:))

小智 5

您可以放心,这不是未定义的行为。

来自MYSQL官方文档

为了解析对同名对象的引用,派生表隐藏了 CTE;CTE 隐藏基表、临时表和视图。名称解析是通过在同一查询块中搜索对象进行的,然后在未找到具有该名称的对象时依次继续到外部块。

所以就名称解析优先级而言:

派生表 > CTE(WITH块中定义的表)> 其他所有内容