sql >> Database >  >> RDS >> Oracle

PHP Oracle query select statement binnen lus traag

Als ik je code goed heb gelezen, is wat je zoekt een enkele MERGE-instructie die je op de database kunt uitvoeren. Ik ken PHP niet, dus ik kan je niet geven hoe het moet worden aangeroepen, maar ik kan je wel het SQL-statement geven om uit te voeren:

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);

Dit doet de join die je opnieuw aan het uitvinden was met je loops, koppelt het terug aan de tabel waarin je probeert in te voegen en voegt alleen een rij in als deze nog niet in de tabel bestaat.

Je zou de PHP-code moeten schrijven om dit uit te voeren, nadat je de log_date hebt doorgegeven als een bindvariabele.

Door de variabele te binden, laat u de database de harde parse overslaan (d.w.z. het vinden van de beste manier om de query uit te voeren), wat tijd bespaart.

Door geen gegevens op te halen en handmatig rond te lussen voordat u meer gegevens selecteert en uit te zoeken of u de invoeging moet doen, slaat u een heleboel contextwisselingen en het trekken / duwen van gegevens over het netwerk over. Laat de database het zware werk doen; daar is het voor ontworpen!




  1. Meertalige categorietitels in Mysql-database

  2. Laravel Schema Builder verandert de opslagengine

  3. MySQL-specifieke groep door

  4. Waarom werkt mijn t-sql left join niet?