Объяснение самосоединений

Я не понимаю необходимости самостоятельного объединения. Может кто-нибудь, пожалуйста, объясните мне это?

Простой пример будет очень полезен.

Ответ 1

Вы можете просматривать самостоятельное объединение в виде двух идентичных таблиц. Но при нормализации вы не можете создать две копии таблицы, поэтому вы просто имитируете наличие двух таблиц с самостоятельным объединением.

Предположим, у вас есть две таблицы:

Таблица emp1

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   

Таблица emp2

Id Name Boss_id            
1   ABC   3                   
2   DEF   1                   
3   XYZ   2                   

Теперь, если вы хотите получить имя каждого сотрудника с именами его или ее начальника:

select c1.Name , c2.Name As Boss
from emp1 c1
    inner join emp2 c2 on c1.Boss_id = c2.Id

Который выведет следующую таблицу:

Name  Boss
ABC   XYZ
DEF   ABC
XYZ   DEF

Ответ 2

Это довольно часто, когда у вас есть таблица, которая ссылается сама. Пример: таблица сотрудников, в которой каждый сотрудник может иметь менеджера, и вы хотите перечислить всех сотрудников и имя своего менеджера.

SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id

Ответ 3

Самосоединение - это объединение таблицы с самим собой.

Обычный пример использования - это когда в таблице хранятся сущности (записи), которые имеют иерархическое отношение между ними. Например, таблица, содержащая информацию о человеке (имя, DOB, адрес...) и включающая столбец, в который включен идентификатор Отца (и/или матери). Затем с небольшим запросом типа

SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN  myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago'  -- Or some other condition or none

мы можем получить информацию о ребенке и отце (и матери, со вторым самостоятельным подключением и т.д. и даже о великих родителях и т.д.) в том же запросе.

Ответ 4

Скажем, у вас есть таблица users, настроенная так:

  • идентификатор пользователя
  • имя пользователя
  • идентификатор менеджера пользователя

В этой ситуации, если вы хотите вытащить как пользовательскую информацию , так и информацию о менеджере в одном запросе, вы можете сделать это:

SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id

Ответ 5

Они полезны, если ваша таблица является самореференциальной. Например, для таблицы страниц каждая страница может иметь ссылку next и previous. Это будут идентификаторы других страниц в одной таблице. Если в какой-то момент вы хотите получить тройку последовательных страниц, вы бы сделали два самостоятельных объединения в столбцах next и previous с тем же столбцом id.

Ответ 6

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

Ответ 7

Представьте таблицу под названием Employee, как описано ниже. У всех сотрудников есть менеджер, который также является сотрудником (возможно, за исключением генерального директора, чей менеджер_ид был бы нулевым).

Table (Employee): 

int id,
varchar name,
int manager_id

Затем вы можете использовать следующий выбор, чтобы найти всех сотрудников и их менеджеров:

select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id

Ответ 8

Здесь есть много правильных ответов, но есть вариация, которая одинаково правильна. Вы можете поместить свои условия соединения в оператор соединения, а не в предложение WHERE.

SELECT e1.emp_id AS 'Emp_ID'
  , e1.emp_name AS 'Emp_Name'
  , e2.emp_id AS 'Manager_ID'
  , e2.emp_name AS 'Manager_Name'
FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id

Помните, что иногда вы хотите e1.manager_id > e2.id

Преимущество в том, что вы знаете оба сценария, иногда у вас есть тонна условий WHERE или JOIN, и вы хотите поместить свои условия самостоятельного присоединения в другое предложение, чтобы ваш код читался.

Никто не обращался к тому, что происходит, когда у Работника нет менеджера. А? Они не включены в результирующий набор. Что делать, если вы хотите включить сотрудников, у которых нет менеджеров, но вы не хотите возвращать неверные комбинации?

Попробуйте этот щенок;

SELECT e1.emp_id AS 'Emp_ID'
   , e1.emp_name AS 'Emp_Name'
   , e2.emp_id AS 'Manager_ID'
   , e2.emp_name AS 'Manager_Name'
FROM Employee e1 LEFT JOIN Employee e2 
   ON e1.emp_id = e2.emp_id
   AND e1.emp_name = e2.emp_name
   AND e1.every_other_matching_column = e2.every_other_matching_column

Ответ 9

Помимо ответов, упомянутых выше (которые очень хорошо объяснены), я хотел бы добавить один пример, чтобы можно было легко показать использование Self Join. Предположим, у вас есть таблица с именем CUSTOMERS, которая имеет следующие атрибуты: CustomerID, CustomerName, ContactName, City, Country. Теперь вы хотите перечислить всех тех, кто из "одного города". Вам придется подумать о реплике этой таблицы, чтобы мы могли присоединиться к ней на основе CITY. В приведенном ниже запросе будет ясно показано, что это означает:

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, 
A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City 
ORDER BY A.City;

Ответ 10

Один пример использования - проверка дубликатов записей в базе данных.

SELECT A.Id FROM My_Bookings A, My_Bookings B
WHERE A.Name = B.Name
AND A.Date = B.Date
AND A.Id != B.Id

Ответ 11

Это эквивалент базы данных связанного списка/дерева, где строка содержит ссылку в некоторой емкости для другой строки.

Ответ 12

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

Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName

Например, мы хотим найти имена сотрудников, чье начальное назначение соответствует текущему назначению. Мы можем решить это, используя self join следующим образом.

SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId

Ответ 13

Вот экзапликация самосознания в неспециалистских терминах. Self join - это не другой тип соединения. Если вы поняли другие типы объединений (Внутренние, Внешние и Перекрестные Соединения), то самосоединение должно быть прямым. В INNER, OUTER и CROSS JOINS вы присоединяетесь к двум или более различным таблицам. Однако, присоединяясь к себе, вы присоединяетесь к той же таблице с помощью itlef. Здесь у нас нет двух разных таблиц, но мы обрабатываем одну и ту же таблицу как другую таблицу с использованием псевдонимов таблиц. Если это еще не ясно, я бы рекомендовал посмотреть следующие видеоролики YouTube.

Self Присоединиться к примеру