В блоге Крейга Фридмана « Объединение вложенных циклов» он объясняет, почему объединение вложенных циклов не может поддерживать правильное внешнее объединение:
Проблема в том, что мы сканируем внутреннюю таблицу несколько раз - по одному разу для каждой строки внешнего соединения. Мы можем встречаться с одними и теми же внутренними строками несколько раз во время этих нескольких проверок. В какой момент мы можем заключить, что определенный внутренний ряд не имеет или не будет присоединяться?
Может ли кто-нибудь объяснить это действительно простым и образовательным способом?
Означает ли это, что цикл начинается с внешней таблицы ( R1
) и сканирует внутреннюю ( R2
)?
Я понимаю, что для R1
значения, которое не соединяется с R2
, его следует заменить на NULL
так, чтобы результирующий набор стал ( NULL, R2
). Для меня кажется невозможным вернуть R2
значение, когда R1
не присоединяется, по той причине, что он не может знать, какое R2
значение вернуть. Но это не так, как это объясняется. Или это?
SQL Server фактически оптимизирует (и часто заменяет) RIGHT JOIN
на LEFT JOIN
, но вопрос в том, чтобы объяснить, почему технически невозможно NESTED LOOPS JOIN
использовать / поддерживать RIGHT JOIN
логику.