Фон
Следующие данные являются конкретным примером общей проблемы (отсортированной по имени столбца):
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
(как в элементе «Resource Bundle» для интернационализации) экземпляр содержит схему, таблицу (или представление), столбецимя и другая информация, используемая для уникальной идентификации столбца базы данных и облегчения перевода.Каждый 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
можно отбросить, так как он не нужен для присоединения.
Обновления
Операндом условия сравнения слева являютсяпервичные ключи, имя соответствующей таблицы (или представления) которых указано дважды (или более).Это дает:
- companylocation
- personemploymentcurrent
Вопрос
Как бы вы создали операторы JOIN, используя данный набор данных?
Большое спасибо.