Поделиться через


Как создать самосоединения вручную (визуальные инструменты для баз данных)

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

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

Например, если создается самосоединение для получения всех пар авторов, живущих в г. Беркли, необходимо сравнить столбец 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

Создание самосоединения вручную

  1. В область схем добавьте необходимую таблицу или возвращающий табличное значение объект.

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

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

  3. Щелкните правой кнопкой мыши указанное соединение и в контекстном меню выберите Свойства.

  4. В окне «Свойства» выберите вкладку Условие и тип соединения и нажмите кнопку (...) справа от нужного свойства.

  5. В диалоговом окне «Соединение» измените оператор сравнения первичных ключей. Например, можно выбрать оператор «меньше» (<).

  6. Создайте дополнительное условие соединения, например authors.zip = authors1.zip, перетащив имя основного столбца соединения в первом экземпляре таблицы или возвращающего табличное значение объекта в область соответствующего столбца второго экземпляра.

  7. Задайте другие параметры запроса, например выходные столбцы, условия поиска и порядок сортировки.