смущен результатом многократного присоединения к одной и той же таблице


person codingknob    schedule 28.04.2013    source источник


Ответы (2)


Хорошо, я объясню , как я это написал.

Запрос 2

 select *
    from TableA as a right outer join tableB as b on b.city1id = a.id
    left outer join tableB parent on parent.city2id = b.city1id

Вы можете переписать этот запрос следующим образом:

select *
from Tableb as b left outer join tablea as a on b.city1id = a.id
left  outer join tableb parent on parent.city2id = b.city1id

1-е левое внешнее соединение между таблицей B и таблицей A делает это

TableB( get all records ) and tableA matching records = call this result set as T

2-е левое внешнее соединение между T и tableb делает это

T ( get all records ) and tableb matching records

см. здесь

Запрос 1

select *
from TableA as a right outer join tableB as b on b.city1id = a.id

можно написать так

select *
from Tableb as b left outer join tablea as a on b.city1id = a.id

это просто делает это

1-е левое внешнее соединение между таблицей B и таблицей A (что объясняется в предыдущем запросе)

 TableB( get all records ) and tableA matching records 
person Sankara    schedule 28.04.2013
comment
Спасибо. Это очень хорошее объяснение. Единственное, что меня смущает, это установка T, и результат T (get all records) and tableb matching records в этом случае кажется одним и тем же - нет? Посмотрите на результаты запроса в обоих случаях. Может быть, я что-то упустил из виду? Я ценю вашу помощь. Спасибо. - person codingknob; 29.04.2013

Настоящий вопрос здесь заключается в следующем: какова ваша цель. Внешнее соединение просто означает, что упомянутая сторона (левая или правая) является стороной, из которой будут извлекаться записи, тогда противоположная сторона будет извлекать совпадающие записи или null, если такие совпадения не найдены.

Поскольку у вас есть A right B left (B as parent), оба соединения будут извлекать записи из B, а таблица A будет извлекать только совпадения или нулевые значения по мере необходимости. Таким образом, ваш основной запрос — это вся таблица B, при этом таблица A извлекается по мере того, как вы устанавливаете совпадения, и, наконец, B as parent извлекается по мере обнаружения там совпадений.

Таким образом, два запроса направляются к таблице pull B в качестве ядра ответа, а таблица B контролирует количество возвращаемых строк: все строки B. В вашей скрипке это 7 строк.

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

person Godeke    schedule 28.04.2013