我有多个以“ PLAYERS_”开头的表,它们包含一些我要立即检索的数据。将来我可能会添加更多以“ PLAYER_”开头的表,因此我想拥有一条select语句,该语句将为我提供这些表的所有数据,而无需我从所有这些表中进行选择。
这是我要使用的选择语句,但我认为它不准确:
SELECT * FROM (SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'PLAYER_%';
这一切都是为了让我得到子查询的结果,这是表的信息(不是我所需要的)。有没有其他方法可以实现我要达到的目标?
我要实现的目标与:
SELECT * FROM PLAYER_1, PLAYER_2, PLAYER_3;
但是我想要以一种不必担心放置这样的表名的方式进行操作。
答案 0 :(得分:6)
正如其他人所说,这是一个糟糕的设计。您仍然可以做这样的事情。
假设您仅从所有表中选择公共列,则可以创建一个动态视图,该视图将对所有现有播放器表进行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;
/
然后在每次添加新表时通过执行块(或将其放入过程)从视图中进行选择。
select * from v_player_all;
您也可以与user_tab_columns
一起仅动态选择公共列。