2016-03-22 3 views
0

Ich habe versucht, eine Select-Abfrage mit einer temporären Tabelle zu optimieren (ich bin mehr an SQL Server gewöhnt, also gibt es vielleicht einen besseren Weg).Ausführen mehrerer Anweisungen mithilfe von Temp-Tabelle in einem einzigen Skript

Die Abfrage ist im Grunde das (etwas vereinfacht): Tabelle erstellen, ausfüllen, verwenden, Tabelle löschen.

create global temporary table trucks (
    nb_trucks int, 
    warehouse int 
) 
on commit preserve rows 
; 
insert into trucks (
    nb_trucks, warehouse 
) 
select 
    sum(pla.NB_TRUCKS) 
    ,pla.id_site 
from ASI_MAS_PLA_PLANIFICATION pla 
group by 
    pla.id_site 
; 
select distinct 
op.operation_id as OPERATION_CODE, 
pla.id_site as WAREHOUSE_ID, 
(
    select 
    coalesce(sum(nb_trucks), 0) 
    from trucks 
    where 
     and trucks.warehouse = pla.id_site 
) as NB_TRUCKS, 
from ASI_MAS_PLA_PLANIFICATION pla 
inner join ASI_MAS_PLA_CL_PLANIF_OP op 
    on op.planif_operation_id = pla.z_planif_operation_id 
where 
    pla.z_remainder = 0 
group by 
    op.operation_id 
    ,pla.id_site 
order by 
    op.operation_id 
; 
truncate table trucks; 
drop table trucks; 

Aus verschiedenen technischen Gründen muss ich diese Aktionen in einem einzigen Skript auszuführen (eigentlich muss ich den „select“ Teil nur ausführen, sondern eine temporäre Tabelle nicht verwenden sendet die Ausführungszeit durch das Dach).

Ich habe das Skript in einem begin ... end; Block platziert, aber es mag nicht, dass ich eine Tabelle als erste Anweisung "erstellen".

As I saw here, Ich versuche derzeit, jede Aussage mit einem "execute sofort" like this zu wickeln, aber ich bin nicht sehr gern diese Lösung.

Wie kann ich mehrere Anweisungen, einschließlich einer "create", in einem einzigen SQL-Skript ausführen?

Antwort

0

Ohne einen EXPLAIN Plan ist schwer zu verstehen. Vielleicht eine „mit“ -Klausel Hilfe:

WITH trucks AS 
(SELECT /*+ materialize */ 
    SUM(pla.nb_trucks) nb_trucks, 
    pla.id_site warehouse 
    FROM asi_mas_pla_planification pla 
    GROUP BY pla.id_site) 
SELECT DISTINCT op.operation_id AS operation_code, 
       pla.id_site AS warehouse_id, 
       (SELECT coalesce(SUM(nb_trucks), 0) 
        FROM trucks 
        WHERE trucks.warehouse = pla.id_site) AS nb_trucks 
    FROM asi_mas_pla_planification pla 
INNER JOIN asi_mas_pla_cl_planif_op op 
    ON op.planif_operation_id = pla.z_planif_operation_id 
WHERE pla.z_remainder = 0 
GROUP BY op.operation_id, 
      pla.id_site 
ORDER BY op.operation_id; 

aber ich denke, es gibt einige Probleme mit der Logik der Abfrage. Ich denke, Sie zählen die Lastwagen nicht richtig. Aber du weißt, ob das stimmt.

Vielleicht ist diese Abfrage besser?

SELECT op.operation_id AS operation_code, 
     pla.id_site AS warehouse_id, 
     nvl(SUM(pla.nb_trucks), 0) nb_trucks 
    FROM (SELECT /*+ materialize*/ id_site, 
       z_planif_operation_id, 
       SUM(nb_trucks) nb_trucks 
      FROM asi_mas_pla_planification 
     WHERE z_remainder = 0 
     GROUP BY id_site, 
        z_planif_operation_id) pla 
INNER JOIN asi_mas_pla_cl_planif_op op 
    ON op.planif_operation_id = pla.z_planif_operation_id 
GROUP BY op.operation_id, 
      pla.id_site 
ORDER BY op.operation_id; 

Grüße

+0

Ich habe versucht, einen gemeinsamen Tabellenausdruck, aber die Ausführungszeit ist sehr lang. – thomasb

+0

Ich habe meine Antwort bearbeitet ... hoffe, es hilft. – StefanG

Verwandte Themen