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