Причина, по которой исходный запрос не выполнен и, следовательно, возвращает данные, состоит в том, что у вас есть 2 подходящие строки (515, 516) и (515, 517), каждая из которых существует в обеих таблицах. При позиционировании по одному из ваших критериев «s.main_rule = sa.main_rule и (s.child_rule <> sa.child_rule))» возвращает другой. При расположении на s (515, 516) и оценке sa (515, 517) это выражение становится «515 = 515 и 516 <> 517», которое оценивает True, и поэтому предикат EXISTS оценивает true, таким образом, строка выводится. По тому же сценарию. происходит при оценке (515, 517). Запрос @GordonLinoff возвращает то, что вы хотите, потому что, как он говорит, «покажите пары, которые находятся в одной таблице, но не в другой»