如何使用mysql列出视图中使用的表

Posted

技术标签:

【中文标题】如何使用mysql列出视图中使用的表【英文标题】:How to list tables used in a view with mysql 【发布时间】:2015-10-08 11:35:17 【问题描述】:

我需要一个在 mysql 的视图中使用的表的列表。 例如,如果我有这样的视图:

SELECT * FROM table1
JOIN  table2
ON table1.id = table2.id

我要获取:table1,table2

【问题讨论】:

【参考方案1】:

很遗憾,我认为这不可能直接实现。相反,您需要查询和解析实际的视图定义:

SELECT VIEW_DEFINITION
FROM INFORMATION_SCHEMA.VIEWS
WHERE
TABLE_NAME = ?;

【讨论】:

View_definition 返回视图的孔脚本。我需要脚本中提到的表格列表。 不幸的是,我不相信这是可能的。相反,您需要查询和解析实际的视图定义。让我看看还能找到什么【参考方案2】:

.

mysql> CREATE VIEW vw_test AS  
    -> SELECT * FROM table1 JOIN table2 ON table1.id = table2.id;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS
    -> WHERE TABLE_NAME = 'vw_test';
+------------------------------------------------------------------+
| VIEW_DEFINITION                                                  |
+------------------------------------------------------------------+
| select * from table1 join table2 on table1.id = table2.id;       |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

那么您可以使用以下任何工具来解析表名:

    Terence Parr 的 ANTLR 解析器生成器(Java,但可以生成多种目标语言中的任何一种的解析器)有多种可用的 SQL 语法,包括用于 PL/SQL 的一对,用于 SQL Server SELECT 语句的一对,用于 mySQL 的一个, 一个用于 ISO SQL - (http://www.antlr.org/grammar/list)。

    我从这里的 SO 回答中得到了这个:SQL parser library for Java - Retrieve the list of table names present in a SQL statement

    Data Tools Project - SQL Development Tools (http://www.eclipse.org/datatools/project_sqldevtools/)。

    这是SQL Query Parser (http://www.eclipse.org/datatools/project_sqldevtools/sqltools_doc/SQL%20Query%20Parser%20User%20documentation.htm) 的文档。

    这是一个博客,其中描述了如何“Get columns and tables in SQL script (Java version)”http://www.dpriver.com/blog/list-of-demos-illustrate-how-to-use-general-sql-parser/get-columns-and-tables-in-sql-script/

    或根据以下内容为自己编写一个自定义 mySQL 过程(可在此处找到 - http://www.sqlparser.com/fetch-table-column-name-example-extact-all-table-field-name.php):

    SELECT c_mandant, hist_datum, parkey1, parkey2, funktionscode, ma_parkey, me_parkey 
     , CASE WHEN EXISTS (SELECT 1 
                           FROM CDS_H_GRUPPE  GRP1 
                          WHERE GRP1.c_mandant = c_mandant 
                            AND GRP1.hist_datum    = ADD_MONTHS(LAST_DAY(TRUNC(SYSDATE)), -1) 
                            AND GRP1.funktionscode = 'H' 
                            AND GRP1.parkey1       = ma_parkey) 
              THEN 1 
          ELSE NULL 
       END MA_ME 
     , CASE WHEN EXISTS (SELECT 1 
                           FROM CDS_H_GRUPPE    GRP2 
                          WHERE GRP2.c_mandant     = c_mandant 
                            AND GRP2.hist_datum    = ADD_MONTHS(LAST_DAY(TRUNC(SYSDATE)), -1) 
                            AND GRP2.funktionscode = 'U' 
                            AND GRP2.parkey1       = me_parkey) 
              THEN 1 
          ELSE NULL 
       END ME_MA 
     , ROW_NUMBER() OVER (PARTITION BY c_mandant, ma_parkey, me_parkey ORDER BY c_mandant, ma_parkey, me_parkey)  ANZ_MA 
      FROM (SELECT c_mandant, hist_datum, parkey1, parkey2, funktionscode 
             , CASE WHEN funktionscode = 'U' 
                      THEN parkey1 
                  ELSE parkey2 
               END MA_PARKEY 
             , CASE WHEN funktionscode = 'U' 
                      THEN NULL 
                  ELSE parkey1 
               END ME_PARKEY 
          FROM 
               CDS_H_GRUPPE 
         WHERE 
               funktionscode IN ('U', 'H') 
           AND hist_datum    = ADD_MONTHS(LAST_DAY(TRUNC(SYSDATE)), -1) 
       ) 
    

【讨论】:

【参考方案3】:

这就是你想要的...这可以得到在视图中使用的表格和连接在一起的表格..但它可以得到一个连接...如果想要更多添加更多提示..

希望这能解决您的问题...

select 
    case 
        when view_definition regexp '.*from +.*'
        then substring_index(substring_index(view_definition, 'from ', -1), ' ', 1)
    end as 'primary table',
    case 
        when view_definition regexp '.*join +.*'
        then substring_index(substring_index(view_definition, 'join ', -1), ' ', 1)
    end as 'joined table'
from information_schema.views where table_name="YOUR VIEW NAME" and table_schema="shotbot_production";

【讨论】:

【参考方案4】:

这是不可能的。您必须查找视图的定义并自己手动完成。

【讨论】:

以上是关于如何使用mysql列出视图中使用的表的主要内容,如果未能解决你的问题,请参考以下文章

触发器导致在视图中使用的表上插入后,如何进行 MYSQL 视图更新

查询以找出视图中使用的表

MySQL创建视图连接两个完整的表

如何查找存储过程中引用的表及其关联列

如何在flutter中使用mysql数据库(或json)中的sharedpreferences键选择以列出最喜欢的记录?

如何在 Google BigQuery 中列出与特定名称匹配的表?