У блозі Крейга Фрідмана, Nested Loops Join , він пояснює, чому вкладені петлі з'єднання не можуть підтримувати правильне зовнішнє з'єднання:
Проблема полягає в тому, що ми скануємо внутрішню таблицю кілька разів - один раз для кожного ряду зовнішнього з'єднання. Під час цих кількох сканувань ми можемо зустріти одні й ті ж внутрішні рядки кілька разів. На якому моменті можна зробити висновок, що певний внутрішній ряд не приєднується чи не буде?
Чи може хтось, будь ласка, пояснити це по-справжньому простим та навчальним способом?
Чи означає це, що цикл починається з зовнішньої таблиці ( R1) і сканує внутрішню ( R2)?
Я розумію, що для R1значення, яке не поєднується R2, його слід замінити NULLтаким чином, набір результатів стає ( NULL, R2). Мені здається неможливим повернути R2значення, коли R1воно не приєднується, з тієї причини, що він не може знати, яке R2значення повернути. Але це не так, як це пояснюється. Або це?
SQL Server робить фактично оптимізують (і часто замінює) RIGHT JOINз LEFT JOIN, але питання в тому , щоб пояснити , чому це технічно неможливо для NESTED LOOPS JOINвикористання / підтримки RIGHT JOINлогіки.