Практическое руководство. Создание самосоединения вручную
Самосоединение таблицы может быть создано даже в случае отсутствия рефлексивной связи таблица — база данных. Например, самосоединение может быть использовано для извлечения сведений о парах авторов, живущих в одном городе.
Как и для любого другого соединения, для самосоединения требуется не менее двух таблиц. Различие состоит в том, что при самосоединении в роли второй таблицы выступает копия первой таблицы. Таким образом можно сравнивать столбцы двух экземпляров одной таблицы, что позволяет сравнивать значения элементов одного столбца друг с другом. Конструктор запросов и представлений присваивает второму экземпляру таблицы псевдоним.
Например, если создается самосоединение для получения всех пар авторов, живущих в г. Беркли, необходимо сравнить столбец 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.
Чтобы вручную создать самосоединение
В область схем добавьте необходимую таблицу или возвращающий табличное значение объект.
Затем еще раз добавьте эту таблицу, чтобы в области схем отображалось два экземпляра одной таблицы или возвращающего табличное значение объекта.
Конструктор запросов и представлений присваивает второму экземпляру таблицы псевдоним, добавляя к ее имени порядковый номер. Кроме того, конструктор запросов и представлений создает внутри области схем соединение указанных экземпляров таблицы или возвращающего табличное значение объекта.
Щелкните правой кнопкой мыши указанное соединение и в контекстном меню выберите пункт Свойства.
В окне "Свойства" выберите вкладку "Условие и тип соединения" и нажмите кнопку с многоточием (...) справа от нужного свойства.
В диалоговом окне "Соединение" измените оператор сравнения первичных ключей. Например, можно выбрать оператор "меньше" (<).
Создайте дополнительное условие соединения, например authors.zip = authors1.zip, перетащив имя основного столбца соединения в первом экземпляре таблицы или возвращающего табличное значение объекта в область соответствующего столбца второго экземпляра.
Задайте другие параметры запроса, например выходные столбцы, условия поиска и порядок сортировки.
См. также
Задачи
Практическое руководство. Автоматическое создание самосоединения