如何使用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 视图更新
如何在flutter中使用mysql数据库(或json)中的sharedpreferences键选择以列出最喜欢的记录?