gpt4 book ai didi

sql - 无法合并联合所有 View

转载 作者:行者123 更新时间:2023-12-04 22:41:22 24 4
gpt4 key购买 nike

我知道 Oracle RDMS 无法合并其中包含集合运算符的 View 。我想知道这是为什么。

例如,这个:

SELECT u.*
FROM
(
SELECT a.a1 A,
a.a2 B
FROM tab_a a
UNION ALL
SELECT b.b1 A,
b.b2 B
FROM tab_b b
) u,
tab_p p
WHERE p.a = u.a

可以变成这样:

SELECT *
FROM
(
SELECT a.a1 A,
a.a2 B
FROM tab_a a,
tab_p p
WHERE p.a = a.a1
UNION ALL
SELECT b.b1 A,
b.b2 B
FROM tab_b b,
tab_p p
WHERE p.a = b.b1
)

这两个查询是等价的,对吧?[编辑]

最佳答案

查询将产生相同的结果集,但执行计划可能不同。我希望第一个查询更有效,因为它与 tab_p 进行一次比较,而在第二个查询中进行两次比较。


以前,两个查询都使用 SELECT *,它们都没有表别名。

不,这些查询不等价。

第一个将从派生表(UNION 语句)和 tab_p 表返回列。第二个查询将只返回派生表(UNION 语句)的值,而不会返回 tab_p 表的列。如果将表别名替换为 SELECT * 会更明显:

第一个查询:

SELECT u.*, p.*
FROM (SELECT a.a1 A,
a.a2 B
FROM tab_a a
UNION ALL
SELECT b.b1 A,
b.b2 B
FROM tab_b b) u,
tab_p p
WHERE p.a = u.a

第二个查询:

SELECT x.*
FROM (SELECT a.a1 A,
a.a2 B
FROM tab_a a,
tab_p p
WHERE p.a = a.a
UNION ALL
SELECT b.b1 A,
b.b2 B
FROM tab_b b,
tab_p p
WHERE p.a = b.a) x

内部查询的 SELECT 子句中没有 tab_p 列,供外部查询在最终结果集中提供。

这个:

SELECT *
FROM (SELECT a.a1 A,
a.a2 B
FROM tab_a a
UNION ALL
SELECT b.b1 A,
b.b2 B
FROM tab_b b) u
JOIN tab_p p ON p.a = u.a

..相当于第一个查询。它使用 ANSI-92 连接语法与第一个查询中使用的 ANSI-89 语法。

关于sql - 无法合并联合所有 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com