SELECT 语句从不同的表中获取所有列
Posted
技术标签:
【中文标题】SELECT 语句从不同的表中获取所有列【英文标题】:SELECT statement to get all columns from different tables 【发布时间】:2018-10-02 16:17:54 【问题描述】:我有多个以“PLAYERS_”开头的表,它们包含一些我试图一次检索的数据。将来我可能会添加更多以“PLAYER_”开头的表,所以我想要一个 select 语句,它可以让我获得这些表的所有数据,而无需我从所有这些表中进行选择。
这是我尝试使用的选择语句,但我认为它不准确:
SELECT * FROM (SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'PLAYER_%';
所做的只是让我得到作为表信息的子查询的结果(不是我需要的)。有没有其他方法可以实现我想要实现的目标?
我想要达到的效果是一样的:
SELECT * FROM PLAYER_1, PLAYER_2, PLAYER_3;
但我想以一种我不应该担心放置这样的表名的方式来做。
【问题讨论】:
修复你的数据模型,让你的球员数据都在一个表中,比如players
。
不能那样做,每个表都是为别的东西创建的。
表格是否都有相同的列?
大多数情况下是的,除了每个表的特殊列。但我正在尝试这些相同的列。
是否有玩家在多张桌子上?
【参考方案1】:
正如其他人所说,这是一个糟糕的设计。你仍然可以这样做。
假设您只从所有表格中选择公共列,您可以创建一个动态视图,它对所有现有玩家表格执行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
以仅动态选择常用列。
【讨论】:
以上是关于SELECT 语句从不同的表中获取所有列的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Raw 语句我可以根据列数据是不是等于另一个表从不同的表中进行选择