Nếu tôi đã đọc mã của bạn một cách chính xác, những gì bạn đang theo dõi là một câu lệnh MERGE duy nhất mà bạn có thể chạy trên cơ sở dữ liệu. Tôi không biết PHP, vì vậy tôi không thể cung cấp cho bạn cách gọi nó, nhưng tôi có thể cung cấp cho bạn câu lệnh SQL để chạy:
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);
Điều này thực hiện liên kết mà bạn đang phát minh lại với các vòng lặp của mình, liên kết nó trở lại bảng mà bạn đang cố gắng chèn vào và chỉ chèn một hàng nếu nó chưa tồn tại trong bảng.
Bạn sẽ cần viết mã PHP để thực thi điều này, sau khi đã chuyển log_date vào làm biến liên kết.
Bằng cách liên kết biến, bạn cho phép cơ sở dữ liệu bỏ qua phân tích cú pháp cứng (tức là tìm ra cách tốt nhất để thực thi truy vấn), giúp tiết kiệm thời gian.
Bằng cách không tìm nạp dữ liệu và vòng lặp theo cách thủ công trước khi chọn thêm dữ liệu và tìm hiểu xem bạn có cần thực hiện chèn hay không, bạn bỏ qua rất nhiều chuyển đổi ngữ cảnh và kéo / đẩy dữ liệu qua mạng. Để cơ sở dữ liệu thực hiện công việc nặng nhọc; đó là những gì nó được thiết kế để làm!