【发布时间】:2017-11-28 02:14:56
【问题描述】:
我有这样的表:
Table-1
Table-2
Table-3
Table-4
Table-5
每个表都有很多列,其中一个列名为employee_id。
现在,我想写一个查询
1) 返回所有包含此列的表和
2) 如果列具有值或通过传递employee_id 为空值,结果应显示表格。
例如显示表名、Table-1、Table-2、Table-3 中的列名,... whereemployee_id='1234'。
如果其中一个表没有此列,则不需要显示。
我已经通过link 进行了验证,但它只显示表名和列名,而不是通过将某些列值传递给它。
还验证了this,但这里验证了我不想这样做的整个架构。
更新:
找到了解决方案,但使用的是deprecated的xmlsequence,
1)如何将此代码设为 xmltable?
2) 如果表中没有值,则输出应为空/null。或默认为“YES”值
WITH char_cols AS
(SELECT /*+materialize */ table_name, column_name
FROM cols
WHERE data_type IN ('CHAR', 'VARCHAR2') and table_name in ('Table-1','Table-2','Table-3','Table-4','Table-5'))
SELECT DISTINCT SUBSTR (:val, 1, 11) "Employee_ID",
SUBSTR (table_name, 1, 14) "Table",
SUBSTR (column_name, 1, 14) "Column"
FROM char_cols,
TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select "'
|| column_name
|| '" from "'
|| table_name
|| '" where upper("'
|| column_name
|| '") like upper(''%'
|| :val
|| '%'')' ).extract ('ROWSET/ROW/*') ) ) t ORDER BY "Table"
/
【问题讨论】:
-
样本数据和期望的结果真的很有帮助。
-
我认为您可能需要分两步执行此操作 - 获取包含该列的表列表,然后查询每个表(单独或使用 UNION ALL)以获取数据。
-
最大的问题是不能一次性完成(在单个 SQL 查询中)。这是因为您必须查询具有 EMPLOYEE_ID 列的表以获取输入值,但您还必须首先查询数据目录才能找到这些表。但是,对表的查询必须事先知道表的名称。您正在寻找“动态 SQL”,这是一个高级主题 - 您是否觉得高级到可以询问此类问题?
-
在您说您已验证的第二个链接中,该过程正在使用
cols搜索整个架构,这是USER_TAB_COLUMNS的同义词。为什么不通过添加 where 子句条件以仅包含您的表来修改相同的内容?