Кажется, вы не совсем понимаете, что делает, КРОМЕ. Он возвращает отдельные строки из первого набора результатов, которые не соответствуют чему-либо во втором наборе результатов. И обратите внимание, что использование различных для генерации второго набора результатов не имеет никакого полезного эффекта.
Чтобы получить эквивалентный результат с помощью объединения, вам необходимо выполнить внешнее объединение (как вы это сделали), но проверить на отсутствие строк в незарезервированной таблице (TempNotRunResults). Так что-то вроде:
set nocount on;
declare @bill table (account_no tinyint, bill_cycle date);
insert @bill (account_no, bill_cycle) values
(1, '20190531'),
(1, '20190430'),
(2, '20190215'),
(1, '20190531'); -- notice the duplicate for <1, May 31>
declare @notrun table (account_no tinyint, bill_cycle date);
insert @notrun (account_no, bill_cycle) values
(1, '20190430'),
(1, '20190630'),
(1, '20190430'); -- notice the duplicate for <1, Apr 30>
select account_no, bill_cycle from @bill
except
select account_no, bill_cycle from @notrun
;
select bl.account_no, bl.bill_cycle
from @bill as bl left join @notrun as nr
on bl.account_no = nr.account_no
and bl.bill_cycle = nr.bill_cycle
where nr.account_no is null
order by bl.account_no, bl.bill_cycle ;
Обратите внимание на дубликат в объединенной версии. ИСКЛЮЧИТЬ удаляет дубликаты. И поскольку EXCEPT говорит нам, что в TempNotRunResults нет совпадений, нет смысла пытаться включать столбцы из этой таблицы при присоединении - просто их нет, и вам не следует ожидать ничего, кроме NULL. Однако вы присоединились только к ACCOUNT_NO в своей версии для присоединения. Это совсем другая логика, поэтому трудно понять, чего именно вы пытаетесь достичь. И это возвращает нас к запросу от Хана - опубликуйте образцы данных и ожидаемые результаты.