我有多个以“PLAYERS_”开头的表,它们包含一些我试图立即检索的数据。将来我可能会添加更多以“PLAYER_”开头的表,因此我想要一个选择语句来获取这些表的所有数据,而无需从所有这些表中进行选择。
这是我尝试使用的选择语句,但我认为它不准确:
SELECT * FROM (SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'PLAYER_%';
所有这一切都是为了让我得到子查询的结果,这是表的信息(不是我需要的)。有没有其他方法可以实现我想要实现的目标?
我要实现的目标与:
SELECT * FROM PLAYER_1, PLAYER_2, PLAYER_3;
但我想以一种我不应该担心那样放置表名的方式来做。
最佳答案
正如其他人所说,这是一个糟糕的设计。你仍然可以做这样的事情。
假设您只从所有表中选择公共(public)列,您可以创建一个动态 View ,它对所有现有玩家表执行 UNION ALL
。
DECLARE
v_select CLOB;
BEGIN
SELECT
LISTAGG('SELECT col1,col2,col3 FROM ' || table_name,' UNION ALL ' || CHR(10) ) WITHIN GROUP
(
ORDER BY table_name
)
INTO v_select
FROM user_tables WHERE table_name LIKE 'PLAYER_%';
IF
v_select IS NOT NULL
THEN
EXECUTE IMMEDIATE ' CREATE OR REPLACE VIEW v_player_all as ' || v_select;
END IF;
END;
/
然后每次添加新表时通过执行 block (或将其放入过程)从 View 中选择。
select * from v_player_all;
您还可以加入 user_tab_columns
以仅动态选择公共(public)列。
关于sql - SELECT 语句从不同的表中获取所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52612429/