使用CTE的奇怪结果

时间:2018-03-28 17:28:33

标签: 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;

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

1 个答案:

答案 0 :(得分:2)

我猜它与qualified names bypass with有关:

MariaDB Demo

Oracle Demo

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

PostgreSQL Demo - 关系“schema_that_doesnt_exists.tab”不存在

SQLServer Demo - 无效的对象名称'schema_that_doesnt_exists.tab'。

同样:

enter image description here

图片来自: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';

如果我想为测试准备输入数据集,我必须使用实际数据。 使用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';

更多:Unit Tests on Transient Data