2014-02-19 2 views
0

У меня есть несколько вопросов о присоединении к себе, может ли кто-нибудь ответить на него?Что такое sef-join?

  1. Существует ли строгий формат самостоятельного присоединения? Есть sample так:

    SELECT a.column_name, b.column_name... 
    FROM table1 a, table1 b 
    WHERE a.common_field = b.common_field; 
    

Но есть пример, как:

SELECT a.ID, b.NAME, a.SALARY 
    FROM CUSTOMERS a, CUSTOMERS b 
    WHERE a.SALARY < b.SALARY; 

Интересно, это соединение (a.common_field = b.common_field) необходимо? так как оба формата являются самостоятельными.

Как будет оптимизироваться самоподключение? будут ли они рассматриваться как INNER JOIN или CROSS JOIN? особенно, для второго формата, является ли это САМОСТОЯТЕЛЬНЫМ ПРИСОЕДИНЕНИЕМ? В SQLite и PostgreSQL они обрабатываются одинаково?

Мой вопрос, я хочу, чтобы извлечь структуру из связки графов, как данные и мой запрос как

SELECT A.colum, B.colum,....N.colum 
    FROM 
    table1 as A, table1 as B, table1 as C .... table2 as M, table2 as N .... 
    where 
    A.colum1<B.colum1 and 
    C.colum1=D.colum1 and 
    .... 

в запросе, table1, table2 ... единичные таблицы столбцов, они компоненты конечной структуры. является ли моя проблема лучшей в этом формате самостоятельного присоединения? Я нахожу, что в PostgreSQL очень медленный, но быстрый в SQLite, который меня смущает.

ответ

2

Самостоятельно присоединиться ничем не отличается от любого другого объединения, поскольку структура/поведение идет, но они обычно используются по-разному.

Вы должны угробить Устаревшей синтаксис разделенных запятой списков таблиц и использовать ANSI соединяет:

SELECT a.column_name, b.column_name... 
FROM table1 a 
JOIN table1 b 
ON a.common_field = b.common_field; 

Вы можете указать, какой тип JOIN вы хотите быть (JOIN, LEFT JOIN, RIGHT JOIN, CROSS JOIN ..), и как вы хотите связать таблицы друг с другом, как и любое другое соединение. Эквивалентность не требуется, как вы отметили в своем примере a.Salary < b.Salary.

+0

Не нужно использовать одинаковый столбец для обеих таблиц, зависит от ситуации. См. Мой пример. – jean

+0

Для моего второго формата, это САМОКРОСС-ПРИСОЕДИНЯЙТЕСЬ? как будто это так, когда есть много таблиц, вычисление станет очень сложным. У меня аналогичный пример: он работает быстро в SQLite, но очень медленный в PostgreSQL. – user3329081

+0

@ user3329081 Вы можете так подумать, для меня «CROSS JOIN» подразумевает неограниченное отношение, полное декартово произведение, в этом примере вы не присоединяетесь к каждой записи к каждой другой записи, но вы получаете частичную кросс- продукт. –

0

Нет, нет такой вещи.

Самообслуживание - это особый случай соединения таблицы с самим собой. Подумайте об этом, например, о присоединении к двум экземплярам одной и той же вещи (факт не используется двумя экземплярами, но двумя ссылками)

Как правило, вы не можете присоединиться к себе, но вы можете перекрещивать соединение или выходить на стол вместе с самим собой.

Пример:

select * from tbPeople p0 
join tbPeople p1 on p1.id = p0.parentId 
where p0.id = you 

, который возвращает вас и ваших родителей

select * from tbPeople p0 
left join tbPeople p1 on p1.parentId = p0.id 
where p0.id = you 

что возвращает ваши дети, или просто вы в случае, если у вас нет потомства еще

Смежные вопросы