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 语句从不同的表中获取所有列的主要内容,如果未能解决你的问题,请参考以下文章

[22]SQL INSERT INTO SELECT 语句

MySQL-查询

Laravel Raw 语句我可以根据列数据是不是等于另一个表从不同的表中进行选择

MySql操作「数据查询」-20211222

SELECT INTO 和 INSERT INTO SELECT

sql的grant语句用法