如果我正确地阅读了您的代码,那么您所追求的是可以在数据库上运行的单个 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 作为绑定变量传递。
通过绑定变量,您允许数据库跳过硬解析(即找出执行查询的最佳方式),从而节省时间。
通过在选择更多数据并确定是否需要执行插入之前不获取数据并手动循环,您可以跳过大量上下文切换和通过网络拉/推数据。让数据库来完成繁重的工作;这就是它的设计目的!