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


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

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

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

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

Примечание

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Параметры Visual Studio.

Чтобы вручную создать самосоединение

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

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

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

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

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

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

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

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

См. также

Задачи

Практическое руководство. Автоматическое создание самосоединения

Другие ресурсы

Выполнение запросов с помощью соединений