以下数据是一般问题的具体示例(按列名排序):
Primary Key: as_comp.companynamecurrent.companyid
Primary Key: as_comp.companylocation.companyid
Primary Key: as_comp.companylocation.locationid
Primary Key: as_hr.personemploymentcurrent.locationid
Primary Key: as_hr.personnamecurrent.personid
Primary Key: as_hr.personemploymentcurrent.personid
Primary Key: as_hr.personaddresscurrent.personid
Primary Key: as_hr.personemploymentcurrent.positionid
实际上,主键及其关系的数量是动态的(在运行时未知)。生成唯一主键列表的代码类似于以下内容:
// Remove duplicate columns by using a set.
//
Set<String> joins = new HashSet<String>( bundles.size() );
for( Bundle b : bundles.keySet() ) {
joins.add( b.getColumn() );
}
// Match the primary keys in the bundles.
//
for( Bundle b : bundles.keySet() ) {
if( joins.contains( b.getColumn() ) ) {
System.out.println( "Primary Key: " + b.toString() );
}
}
每个Bundle
(如&#34;资源包&#34;国际化项)实例包含架构,表(或视图),列名和用于唯一标识数据库列的其他信息便于翻译。每个Bundle
都可以通过isJoin()
方法回答它是否是主键约束:
boolean bundle.isJoin()
根据上一节中的数据,创建一组JOIN子句,如下所示:
join as_comp_companylocation as_comp_companylocation on (as_hr_personemploymentcurrent.locationid == as_comp_companylocation.locationid)
join as_hr_personnamecurrent as_hr_personnamecurrent on (as_hr_personemploymentcurrent.personid == as_hr_personnamecurrent.personid)
join as_hr_personaddresscurrent as_hr_personaddresscurrent on (as_hr_personemploymentcurrent.personid == as_hr_personaddresscurrent.personid)
join as_comp_companynamecurrent as_comp_companynamecurrent on (as_comp_companylocation.companyid == as_comp_companynamecurrent.companyid)
请注意,positionid
可以删除,因为不需要加入。
左侧比较条件操作数是主键,其对应的表(或视图)名称列出两次(或更多)。这会产生:
如何使用给定的数据集创建JOIN语句?
非常感谢。
答案 0 :(得分:1)
这不一定非常难。
您基本上拥有的是一个表格图表,其边缘描述了表格的连接方式。
然后,当您有要加入的表列表时,您将启动并开始搜索图表。在您浏览图表时,请跟踪连接条件和访问过的节点。
我会详尽地搜索图表,这可能会导致几个路径链接所有表格。只需选择最短的路径。
最后,使用表名作为键并缓存结果,然后您只需要搜索每个唯一表集的图表。这里没有真正的魔力,我不认为,在此之前你必须要有很多表可能会花费任何真正明显的时间。它还为您提供了能够选择两个未直接连接的表的好处,该路径将找到进行连接所需的任何中间表。
答案 1 :(得分:0)
如果它像你描述的那样是静态的,我将静态地准备查询,并根据所选的集群查找它们。即没有涉及算法。
太简单了?吻:)
答案 2 :(得分:0)
算法结果相当深入。基本上:
欢迎改进。