Java与SQL映射器
好的,这就是我要做的。假设我有几个视图,每个视图都可以有别名,诸如此类,每个视图返回到另一个视图、视图或表。我想做的是跟踪一个特定的字段,从它的视图一直到源代码。 例如,如果我有以下sql语句:Java与SQL映射器,java,sql,Java,Sql,好的,这就是我要做的。假设我有几个视图,每个视图都可以有别名,诸如此类,每个视图返回到另一个视图、视图或表。我想做的是跟踪一个特定的字段,从它的视图一直到源代码。 例如,如果我有以下sql语句: replace view blah Select t.acct_nmbr as I_account, sum (t.num1+p.location) as location, from blahTable as t left outer join blahTable2 p on t.acct_nmbr
replace view blah
Select
t.acct_nmbr as I_account,
sum (t.num1+p.location) as location,
from blahTable as t
left outer join blahTable2 p
on t.acct_nmbr=p.acct_nmbr;
这是一个非常简单的案例,但我想要的是,如果我说trace(I_account),我将得到以下层次结构:
I_account --> blahTable ---> acct_nmbr
或者,如果我想知道位置,我会得到以下信息:
location --> sum (t.num1+p.location)-->blahTable --> num1
------------------------------------------------>blahTable2 --> location
您可以看到,添加越来越多的数据可能会使跟踪变得越来越复杂,尤其是在存在多个联接以及select表和派生表的情况下。我目前正试图从头开始编写代码,但我不确定是否有什么东西已经做到了这一点 我认为这是一个有趣的概念。通常,我可能会尝试递归地遍历一个树结构(就是这个结构)。
然而,你很快就会遇到一些问题
CASE
语句都会出现问题。您还没有列出您的RDBMS,但其中一些RDBMS在某些聚合中支持多列(就像DB2为MAX()
)所做的那样)。这将导致问题,因为目标列依赖于检索到的数据Alias
的命令集,它基本上会报告表(或视图引用)实际指向的位置。这将改变您正在查看的“基本”表(从SQL的角度来看)。根据您获取数据的方式,Java代码可能会解析别名,也可能不会解析别名。在这两种情况下,别名通常是临时的,有可能使结果“过期”5.您打算如何处理递归CTE(我假设teradata允许它们)?这是点2的一个wierd子集;其中的任何字段要么解析为“基表”(优化器无论如何都将其视为表),要么对基表进行递归。您需要设计程序来检测这种类型的递归,并适当地处理它。不幸的是,您将无法依赖终止条件(在运行时按行计算);不过,谢天谢地,您不必处理循环关系。我使用的RDBMS是teradata,我可以在视图上进行显示,并获得具有所有语法和类似内容的视图定义。我想把它放到一个基于数据块的树结构中。IE任何派生表之类的,然后从那里对case语句或sum进行更多处理。您如何在视图上进行“显示”——这是通过java实现的吗?这解决了第1点;其他的呢?你为什么想要这个?这对于您的预期用途来说可能是完全不可能的。是的,我只是运行了查询“show view\u name”,并从中获得了作为字符串的定义。基本上,整个要点是显示字段的来源,无论它是一个表还是一个计算或其他什么,都可以得到视图的来源。如果您尝试为它提供一个表名,会发生什么?如何告诉它某个元素是底层元素?关于其他几点,你希望发生什么?特别是在存储过程的情况下,您无法控制它如何决定源/返回数据?我知道由于特定的数据库以及我的体系结构是如何设计的,我何时到达底层。我可以从teradata的Sql保留字中确定其他几点。程序和函数必须具有左右paran,并且不是保留字。因此,任何不是保留字的内容都必须是函数、过程或表/字段名。如果它有paran,那么它必须是一个函数或过程。在这种情况下,我可以做一个显示,并获得数据以及。