Генерировать операторы SQL JOIN - PullRequest
2 голосов
/ 18 апреля 2011

Фон

Следующие данные являются конкретным примером общей проблемы (отсортированной по имени столбца):

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, используя данный набор данных?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Это не должно быть так сложно.

То, что вы в основном имеете, это граф таблиц с ребрами, описывающими, как таблицы объединяются.

Затем, когда у вас есть список таблиц, которые вы хотите объединить, вы начинаете и один и начинаете поиск на графике. По ходу графика отслеживайте критерии объединения и посещенные узлы.

Я бы провел исчерпывающий поиск в графе, что могло бы привести к нескольким путям, связывающим все таблицы. Просто выберите кратчайший путь.

Наконец, используйте имена таблиц в качестве ключа и кешируйте результаты, тогда вам нужно будет только искать график для каждого уникального набора таблиц. Никакой настоящей магии здесь я не думаю, и вам придется иметь МНОГО столов, прежде чем это, вероятно, займет какое-то действительно заметное время. Это также дает вам возможность выбрать две таблицы, которые не связаны напрямую, путь найдет любую промежуточную таблицу, необходимую для установления соединения.

0 голосов
/ 28 апреля 2011

Алгоритм оказался достаточно углубленным.По существу:

  1. Получить список сопоставлений столбцов.
  2. Если столбец является первичным ключом, поместите его в карту на основе его уникально идентифицируемого имени.
  3. Удалите дубликаты первичных ключей.
  4. Сортируйте первичные ключи.
  5. Создайте новую карту, чтобы подсчитать (подсчитать) количество раз, когда появляется первичный ключ.
  6. Создать "дубликат"list "для хранения столбцов первичного ключа, которые встречаются более одного раза.
  7. Перебор отсортированных первичных ключей.
  8. Добавление каждого первичного ключа, который встречается более одного раза, в" дублирующийся список ".
  9. Перебор повторяющихся первичных ключей.
  10. Перебор всех столбцов объединения.
  11. Если столбец равен одному из дубликатов, добавьте его в список столбцов компаратора.
  12. Создание новой строки для хранения текста предложения SQL "join".
  13. Перебор столбцов компаратора (первичный операнд) и отсортированных столбцов (вторичный операнд).
  14. Еслипервичный операнд и вторичный опеrand имеют одно и то же имя столбца, но из разных таблиц, затем строят предложение «join» на основе операндов.
  15. Сохраняют предложение join в списке.

Улучшенияприветствуется.

0 голосов
/ 18 апреля 2011

Если это так же статично, как вы описали, я бы подготовил запросы статически и посмотрел бы их в зависимости от выбранных кластеров. То есть алгоритм не задействован.

Слишком просто? ПОЦЕЛУЙ:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...