gpt4 book ai didi

SQL 从一个表或其他表中选择

转载 作者:行者123 更新时间:2023-12-05 00:32:21 25 4
gpt4 key购买 nike

假设我有一个包含大量记录(> 100'000)的表 A 和一个与 A 具有相同列和大约相同数据量的表 B。
是否有可能通过一个聪明的选择语句,我可以获得表 A 的所有记录或表 B 的所有记录?

由于性能,我对我目前使用的方法不太满意:

select
column1
,column2
,column3
from (
select 'A' as tablename, a.* from table_a a
union
select 'B' as tablename, b.* from table_b b
) x
where
x.tablename = 'A'

最佳答案

顺便说一句,您的方法似乎是标准 SQL 中的唯一方法。

通过更改 UNION,您将显着提高性能。至 UNION ALL . UNION必须从两个表中读入数据,然后在返回任何数据之前消除重复项。
UNION ALL不消除重复。这性能有多好取决于数据库引擎和可能的转向参数。

其实还有另外一种可能。我不知道它的效果如何,但你可以试试:

select *
from ((select const.tableName, a.*
from A cross join
(select 'A' as tableName where x.TableName = 'A')
) union all
(select const.tableName, b.*
from B cross join
(select 'B' as tableName where x.TableName = 'B')
)
) t

没有保证。但这个想法是交叉连接到一个有 1 或 0 行的表。这在 MySQL 中不起作用,因为它不允许 WHERE没有 FROM 的条款.在其他数据库中,您可能需要一个表名,例如 dual .当子查询不包含任何记录时,这使查询引擎有机会完全优化表的读取。当然,仅仅因为您给 SQL 引擎优化的机会并不意味着它会。

此外,“*”是一个坏主意,尤其是在 union 中。但我把它留在了,因为这不是问题的重点。

关于SQL 从一个表或其他表中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13493814/

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