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