Вопрос 1 (Y):
План выполнения (текущий и фактический) показывает, что ваше воображение было правильным: показаны выходные данные каждого узла, включая префикс таблицы - путаница невозможна: узел 3 возвращает следующие два столбца: [#A].[id], [#A].[b_id]
, а узлу 4 нечего возвращать, кроме NULL
/*
id b_id
----------- ----
0 x
1 z
2 z
3 y
4 y
5 y
(6 rows affected)
Table '#B__________________________________________________________________________________________________________________000000000335'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table '#A__________________________________________________________________________________________________________________000000000336'. Scan count 1, logical reads 1, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Rows Executes StmtText NodeId Parent PhysicalOp LogicalOp Argument DefinedValues EstimateRows EstimateIO EstimateCPU AvgRowSize TotalSubtreeCost OutputList Warnings Type EstimateExecutions
---- -------- ------------------------------------------------------------------------------------ ------ ------ ------------ -------------- -------------------------------------------------------------- ----------------------- ------------- ------------- ------------- ----------- ---------------- ----------------------- -------- --------- ------------------
6 1 select * from #A where b_id in (select b_id from #B where foo='l') 1 0 NULL NULL NULL NULL 6 NULL NULL NULL 0,00701002 NULL NULL SELECT NULL
6 1 |--Nested Loops(Left Semi Join) 2 1 Nested Loops Left Semi Join NULL NULL 6 0 2,508E-05 12 0,00701002 [#A].[id], [#A].[b_id] NULL PLAN_ROW 1
6 1 |--Table Scan(OBJECT:([tempdb].[dbo].[#A]), WHERE:([#A].[b_id]=[#A].[b_id])) 3 2 Table Scan Table Scan OBJECT:([tempdb].[dbo].[#A]), WHERE:([#A].[b_id]=[#A].[b_id]) [#A].[id], [#A].[b_id] 6 0,003125 0,0001636 12 0,0032886 [#A].[id], [#A].[b_id] NULL PLAN_ROW 1
6 6 |--Table Scan(OBJECT:([tempdb].[dbo].[#B]), WHERE:([#B].[foo]='l')) 4 2 Table Scan Table Scan OBJECT:([tempdb].[dbo].[#B]), WHERE:([#B].[foo]='l') NULL 1 0,0032035 8,07E-05 9 0,0036877 NULL NULL PLAN_ROW 6
(4 rows affected)
*/
Вопрос 2: запрос возвращает результаты.
Вопрос 3:
SELECT * FROM #A WHERE b_id IN (SELECT b_id FROM #B WHERE foo = 'l');
SELECT * FROM #A WHERE EXISTS (SELECT 'YAAAY' FROM #B WHERE foo = 'l');
SELECT * FROM #A WHERE EXISTS (SELECT 'YAAAY' FROM #B WHERE foo = 'asdafadsf');
Я думаю, что запрос OP можно переписать в эквивалентный запрос EXISTS.
b_id
всегда будет равно b_id
, за исключением случаев, когда результаты из части IN ()
не возвращаются.