Если я правильно прочитал ваш код, то вам нужен только один оператор MERGE, который вы можете запустить в базе данных.Я не знаю PHP, поэтому я не могу дать вам, как он должен называться, но я могу дать вам оператор SQL для запуска:
MERGE INTO mep_tbl_output_details tgt
USING (SELECT mtm.modelid,
mtm.model_name,
mtmc.configurationid,
mtmc.date_code,
mtmc.read_row_after,
mtmc.create_from_format,
mtmc.ip_address,
mtmc.status,
mtmc.ts_code
FROM mep_tbl_model mtm
INNER JOIN mep_tbl_model_configuration mtmc ON mtm.modelid = mtmc.modelid_fk
WHERE mtm.active = 'Y'
AND mtm.location = 'PCBA') src
ON (tgt.modelid_fk = src.modelid
AND tgt.ts_code = src.ts_code
AND tgt.configurationid_fk = src.configurationid
AND tgt.runningdate = :log_date
AND tgt.shift = 'Morning'
AND tgt.quantity_status = 'OK')
WHEN NOT MATCHED THEN
INSERT (tgt.modelid_fk, tgt.running_date, tgt.quantity_status, tgt.ts_code, tgt.shift, tgt.configuration_fk)
VALUES (src.modelid, :log_date, 'OK', src.ts_code, 'Morning', src.configurationid);
Это соединение, которое вы заново изобретали с вашими циклами, связывает его с таблицей, в которую вы пытаетесь вставить, и вставляет строку, только если она еще не существует в таблице.
Вам потребуется написать PHP-код для выполнения этого, имеяпередал log_date как переменную связывания.
Связывая переменную, вы позволяете базе данных пропустить жесткий анализ (то есть выяснение наилучшего способа выполнения запроса), что экономит время.
Не извлекая данные и не зацикливая их вручную перед выбором дополнительных данных и решая, нужно ли вам вставлять данные, вы пропускаете много переключений контекста и извлекаете / проталкиваете данные по сети.Позвольте базе данных сделать тяжелую работу;это то, для чего он предназначен!