Как создать самосоединения вручную (визуальные инструменты для баз данных)
Самосоединение таблицы может быть создано даже в случае отсутствия рефлексивной связи таблица — база данных. Например, самосоединение может быть использовано для извлечения сведений о парах авторов, живущих в одном городе.
Как и для любого другого соединения, для самосоединения требуется не менее двух таблиц. Различие состоит в том, что при самосоединении в роли второй таблицы выступает копия первой таблицы. Таким образом можно сравнивать столбцы двух экземпляров одной таблицы, что позволяет сравнивать значения элементов одного столбца друг с другом. Конструктор запросов и представлений присваивает второму экземпляру таблицы псевдоним.
Например, если создается самосоединение для получения всех пар авторов, живущих в г. Беркли, необходимо сравнить столбец city первого экземпляра таблицы со столбцом city второго экземпляра таблицы. Результирующий запрос может выглядеть так:
SELECT authors.au_fname, authors.au_lname, authors1.au_fname AS Expr2, authors1.au_lname AS Expr3 FROM authors INNER JOIN authors authors1 ON authors.city = authors1.city WHERE authors.city = 'Berkeley'
Для создания самосоединения часто требуется вводить несколько условий соединения. Упомянутая особенность поясняется в представленном ниже примере:
Cheryl Carson Cheryl Carson Abraham Bennet Abraham Bennet Cheryl Carson Abraham Bennet Abraham Bennet Cheryl Carson
Первая строка бесполезна, поскольку в ней указано, что Cheryl Carson живет в том же городе, что и Cheryl Carson. Во второй строке также содержатся бесполезные данные. Чтобы исключить указанные бесполезные данные, необходимо добавить условие, обеспечивающее вывод только тех строк, которые содержат данные о разных авторах. Результирующий запрос может выглядеть так:
SELECT authors.au_fname, authors.au_lname, authors1.au_fname AS Expr2, authors1.au_lname AS Expr3 FROM authors INNER JOIN authors authors1 ON authors.city = authors1.city AND authors.au_id <> authors1.au_id WHERE authors.city = 'Berkeley'
Результирующий набор улучшен:
Cheryl Carson Abraham Bennet Abraham Bennet Cheryl Carson
Однако две результирующие строки содержат избыточные данные. В первой строке указано, что автор с именем Carson проживает в одном городе с Bennet, а вторая строка говорит о том, что автор с именем «Bennet» проживает в одном городе с Carson. Подобного дублирования данных можно избежать, если во втором условии соединения заменить оператор «не равно» на «меньше». Результирующий запрос может выглядеть так:
SELECT authors.au_fname, authors.au_lname, authors1.au_fname AS Expr2, authors1.au_lname AS Expr3 FROM authors INNER JOIN authors authors1 ON authors.city = authors1.city AND authors.au_id < authors1.au_id WHERE authors.city = 'Berkeley'
Результирующий набор имеет следующий вид:
Cheryl Carson Abraham Bennet
Создание самосоединения вручную
В область схем добавьте необходимую таблицу или возвращающий табличное значение объект.
Затем еще раз добавьте эту таблицу, чтобы в области схем отображалось два экземпляра одной таблицы или возвращающего табличное значение объекта.
Конструктор запросов и представлений присваивает второму экземпляру таблицы псевдоним, при этом добавляя к ее имени номер последовательности. Кроме того, конструктор запросов и представлений создает внутри области схем соединение указанных экземпляров таблицы или возвращающего табличное значение объекта.
Щелкните правой кнопкой мыши указанное соединение и в контекстном меню выберите Свойства.
В окне «Свойства» выберите вкладку Условие и тип соединения и нажмите кнопку (...) справа от нужного свойства.
В диалоговом окне «Соединение» измените оператор сравнения первичных ключей. Например, можно выбрать оператор «меньше» (<).
Создайте дополнительное условие соединения, например authors.zip = authors1.zip, перетащив имя основного столбца соединения в первом экземпляре таблицы или возвращающего табличное значение объекта в область соответствующего столбца второго экземпляра.
Задайте другие параметры запроса, например выходные столбцы, условия поиска и порядок сортировки.