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


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

применимо к: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  

Первая строка бесполезна; это означает, что Шерил Карсон живет в том же городе, что и Шерил Карсон. Вторая строка одинаково бесполезна. Чтобы устранить эти бесполезные данные, добавьте другое условие, сохраняющее только те строки результатов, в которых два имена авторов описывают разных авторов. Результирующий запрос может выглядеть следующим образом:

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  

Но две строки результатов являются избыточными. Первый говорит Карсон живет в том же городе, что и Беннет, а второй говорит Беннет живет в том же городе, что и Карсон. Чтобы устранить эту избыточность, можно изменить второе условие соединения с "не равно" на "меньше". Результирующий запрос может выглядеть следующим образом:

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

См. также

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