Вашето предположение е невярно; подзаявката ще бъде изпълнена само веднъж. Причината, поради която е по-бавна от присъединяването, е, че IN
не може да се възползва от индекси; той трябва да сканира своите аргументи веднъж за всеки път WHERE
клаузата се оценява, тоест веднъж на ред в таблица А. Можете да оптимизирате заявката, без да използвате променливи или съхранени процедури, просто като замените IN
със съединение, така:
SELECT tableA.field1, tableA.field2, [...]
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
Освен ако нямате нищо против да върнете всяко поле от двете таблици, трябва да изброите полетата, които искате в SELECT
клауза; tableA.*
, например, ще предизвика синтактична грешка.