Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Hinzufügen von INNER JOIN zu Abfrage mit Unterabfrage mit Inline-Select-Anweisung

Ohne DDL-Anweisungen, die die Tabellen definieren, ist es schwierig zu testen, aber:

  1. Sie vergleichen Datumsangaben mithilfe von Zeichenfolgen – Oracle führt wahrscheinlich eine implizite Konvertierung zurück in ein Datum durch, wobei der Wert von NLS_DATE_FORMAT verwendet wird Sitzungsparameter (der hoffentlich DD-MON-YY ist ), aber wenn sich dies jemals ändert, wird die Abfrage unterbrochen (und die Abfrage wird sich nicht geändert haben, sodass das Debuggen mühsam sein wird). Hören Sie auf, Zeichenfolgen als Datumsangaben zu verwenden, und verwenden Sie Datumsliterale - z. B. DATE '2016-01-01' .
  2. Sie haben das erste HAVING -Klausel vor GROUP BY -Klausel - tauschen Sie sie aus.
  3. Sie mischen auch einen alten Komma-Join und einen ANSI-Join - ersetzen Sie den Komma-Join durch einen INNER JOIN und verschieben Sie die Join-Bedingung aus dem WHERE Klausel.
  4. Gruppierung nach A.TRADING_DWKEY||A.RM_SM_USER_CODE ist ineffizient. Sie haben bereits A.TRADING_DWKEY als einer der GROUP BY Begriffe, verketten Sie die Zeichenfolgen also nicht, sondern schließen Sie die andere Spalte in GROUP BY ein Klausel.

Etwas wie:

Select TRADING_DWKEY,
       RM_SM_NAME,
       FIRST_TRADE,
       'New Footprint' Status,
       Null Q4Vol,
       CQVol 
From (
  Select A.TRADING_DWKEY,
         q.RM_SM_NAME,
         B.FIRST_TRADE,
         SUM(A.RISK_AMOUNT_ADJ)/1000000 CQVol 
  from   FACT_TRADE_ROLLUP A
         INNER JOIN
         ( SELECT   TRADING_DWKEY,
                    MIN(FIRST_TRADE_DATE) FIRST_TRADE  
           FROM     ACCOUNT_FIRST_LAST_TRADE_DATES
           GROUP BY TRADING_DWKEY
           HAVING   MIN(FIRST_TRADE_DATE)>= trunc(sysdate-1,'Y')
         ) B
         ON ( A.TRADING_DWKEY=B.TRADING_DWKEY )
         INNER JOIN REF_RM_SM_REGION q
         ON ( q.RM_SM_USER_CODE = A.RM_SM_USER_CODE )
  WHERE A.DATE_KEY >= DATE '2016-01-01'
  AND   ( (    A.PRODUCT_DWKEY IN('RT')
           AND A.Account_Type='Customer'
          )
        OR A.PRODUCT_DWKEY IN('OB','BS','MM')
        )
  AND   A.Role = 'SM' 
  GROUP BY A.RM_SM_USER_CODE,
           A.TRADING_DWKEY,
           q.RM_SM_NAME,
           B.FIRST_TRADE
  HAVING SUM(A.RISK_AMOUNT_ADJ)>=20000000
);