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
您可以放心,这不是未定义的行为。
为了解析对同名对象的引用,派生表隐藏了 CTE;CTE 隐藏基表、临时表和视图。名称解析是通过在同一查询块中搜索对象进行的,然后在未找到具有该名称的对象时依次继续到外部块。
所以就名称解析优先级而言:
派生表 > CTE(WITH
块中定义的表)> 其他所有内容
归档时间: |
|
查看次数: |
211 次 |
最近记录: |