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


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

Область применения: SQL Server

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

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

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

См. также

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