Я думаю, что вы смотрите на сравнение между исходной и целевой таблицами неправильно.
Слияние изначально основано на данных, которые находятся в исходной таблице, и затем есть ли соответствующие данные в целевой таблице.Вы, кажется, ожидаете, что это будет работать наоборот.
С:
USING (SELECT field_name FROM table_name WHERE field_name = '12345') S
ON (tbl.field_name = S.field_name)
, если в исходной таблице есть строка с этим значением, тогда S
имеет одну строку(при условии, что он уникален), и в целевой таблице может быть или не быть совпадающей строки;он будет входить либо в совпавшие, либо в несоответствующие предложения, как и ожидалось, в зависимости от того, что находится в целевой таблице, но только с использованием значений из выбранной исходной строки.
Но если в исходной таблице нет строки стогда это значение S
является пустым результирующим набором, поэтому предложение ON
ничего не может сделать, поэтому оно никогда не оценивается - и в этом случае оно не достигает несоответствующего условия.Нечего сравнивать, и «ничто» не соответствует или и не соответствует ничему другому.
Принимая во внимание:
USING dual
ON (tbl.field_name = '12345')
всегда есть ровно однострока в dual
, поэтому предложение ON
всегда оценивается - хотя на самом деле он не использует эту строку dual
или ее столбец dummy
- и в целевой таблице может быть или не быть соответствующей записи,так что это переходит в ожидаемую ветку.Вы не можете иметь пустой результирующий набор из исходной таблицы, так как он теперь dual
, который не может быть пустым.
В любом случае кажется, что ваше несоответствующее предложение, по крайней мере, неиспользуя данные из S
, что обычно имеет место - в противном случае версия dual
будет работать либо.