MySQL позволяет использовать кортеж как переменную:
Это ваше заявление:
INSERT INTO sales (name, id)
SELECT name, id FROM sales_h
WHERE name AND id NOT IN (SELECT name, id FROM T_sales);
Проблема в «имя и идентификатор». Преврати это в кортеж:
INSERT INTO sales (name, id)
SELECT name, id FROM sales_h
WHERE (name, id) NOT IN (SELECT name, id FROM T_sales);
Лично мне это не очень нравится по двум причинам: кортеж как переменная не работает (или работает по-другому) на других RDBMS, а IN имеет тенденцию работать плохо во многих ситуациях, поэтому мне нравится делать это привычка не использовать ВО.
Как заявляет jhonny-d-cano-leftware (я модифицировал его), я бы использовал где не существует:
INSERT INTO sales (name, id)
SELECT name, id FROM sales_h a
WHERE not exists (
SELECT *
FROM T_sales b
where b.id = a.id and b.name = a.name);