Jika saya telah membaca kode Anda dengan benar, yang Anda cari adalah satu pernyataan MERGE yang dapat Anda jalankan di database. Saya tidak tahu PHP, jadi saya tidak bisa memberi Anda bagaimana seharusnya dipanggil, tapi saya bisa memberi Anda pernyataan SQL untuk dijalankan:
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);
Ini melakukan gabungan yang Anda ciptakan kembali dengan loop Anda, menautkannya kembali ke tabel yang Anda coba masukkan, dan hanya menyisipkan baris jika belum ada di tabel.
Anda perlu menulis kode PHP untuk mengeksekusi ini, setelah memasukkan log_date sebagai variabel bind.
Dengan mengikat variabel, Anda mengizinkan database untuk melewatkan hard parse (yaitu menemukan cara terbaik untuk mengeksekusi kueri), yang menghemat waktu.
Dengan tidak mengambil data dan mengulang putaran secara manual sebelum memilih lebih banyak data dan bekerja jika Anda perlu melakukan penyisipan, Anda melewatkan banyak pengalihan konteks dan menarik/mendorong data di seluruh jaringan. Biarkan database melakukan pekerjaan berat; itulah yang dirancang untuk dilakukan!