sam*_*amg 1 sql database oracle plsql
我有多个以"PLAYERS_"开头的表,它们包含一些我想要一次检索的数据.我可能会在将来添加更多以"PLAYER_"开头的表,所以我希望有一个select语句,它可以获取这些表的所有数据,而无需从所有这些表中进行选择.
这是我正在尝试使用的select语句,但我认为它不准确:
SELECT * FROM (SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'PLAYER_%';
Run Code Online (Sandbox Code Playgroud)
所有这一切都是让我得到子查询的结果,这是表的信息(不是我需要的).有没有其他方法可以实现我想要实现的目标?
我想要实现的目标与:
SELECT * FROM PLAYER_1, PLAYER_2, PLAYER_3;
Run Code Online (Sandbox Code Playgroud)
但是我想以一种我不应该担心像这样放表名的方式来做这件事.
正如其他人所说,这是一个糟糕的设计.你仍然可以做这样的事情.
假设您只选择所有表中的公共列,您可以创建一个动态视图,它可以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;
/
Run Code Online (Sandbox Code Playgroud)
然后每次添加新表时通过执行块(或将其放入过程)从视图中选择.
select * from v_player_all;
Run Code Online (Sandbox Code Playgroud)
您也可以加入以user_tab_columns仅动态选择公共列.