使用CTE的奇怪结果

Ale*_*dra 8 sql oracle common-table-expression

有人可以解释一下为什么这个脚本会返回'some_word'但是没有关于不存在的模式试图从中检索数据的错误schema_that_doesnt_exist.tab吗?

with tab as 
(
     select 'some_word' str 
     from dual
)
select * 
from schema_that_doesnt_exist.tab;
Run Code Online (Sandbox Code Playgroud)

有关此问题的Oracle文档中的某些URL也对我有所帮助.

Luk*_*zda 2

我猜它与限定名称绕过有关:

MariaDB 演示

甲骨文演示

SQLite 演示 -- 没有这样的表:schema_that_doesnt_exists.tab

PostgreSQL 演示 ——关系“schema_that_doesnt_exists.tab”不存在

SQLServer 演示-- 对象名称“schema_that_doesnt_exists.tab”无效。


与...一样:

在此输入图像描述

图片来自:https ://modern-sql.com/blog/2018-04/mysql-8.0

无论如何,当您需要模拟一些数据以进行数据库单元测试(只读查询)时,它可能很有用。

例如:

SELECT *
FROM schema.table_name  -- here goes real data (lots of records)
WHERE col = 'sth';
Run Code Online (Sandbox Code Playgroud)

如果我想准备用于测试的输入数据集,我必须使用实际数据。使用WITH我可以将其重写为:

WITH table_name AS (
    SELECT 'sth'  AS col, ... FROM dual UNION ALL
    SELECT 'sth2' AS col, ... FROM dual...
)
SELECT *
FROM schema.table_name  -- cte is closer and data is taken from it
WHERE col = 'sth';
Run Code Online (Sandbox Code Playgroud)

更多:瞬态数据的单元测试