sql >> Databasteknik >  >> RDS >> Oracle

Lägga till INNER JOIN till fråga med delfråga med inline-valutlåtande

Utan några DDL-satser som definierar tabellerna är det svårt att testa men:

  1. Du jämför datum med strängar - Oracle gör förmodligen en implicit konvertering tillbaka till ett datum med värdet för NLS_DATE_FORMAT sessionsparameter (som förhoppningsvis är DD-MON-YY ) men om detta någonsin ändras kommer det att bryta frågan (och frågan kommer inte att ha ändrats så det blir jobbigt att felsöka). Sluta använda strängar som datum och använd datumbokstavar - dvs DATE '2016-01-01' .
  2. Du har den första HAVING sats före GROUP BY klausul - byt om dem.
  3. Du blandar också en äldre komma-join och ANSI-join - ersätt komma-join med en INNER JOIN och flytta kopplingsvillkoret från WHERE klausul.
  4. Gruppera efter A.TRADING_DWKEY||A.RM_SM_USER_CODE är ineffektivt. Du har redan A.TRADING_DWKEY som en av GROUP BY termer så sammanfoga inte strängarna bara inkludera den andra kolumnen i GROUP BY klausul.

Något i stil med:

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


  1. php mysql idag, igår och datum från databasen

  2. asp.net-applikationen ansluter inte till oracle 11g även efter installation av oracle instant client för 11g

  3. ORA-00947:Inte tillräckligt med värden

  4. Postgresql DROP TABLE fungerar inte