sql >> Database >  >> RDS >> Oracle

INNER JOIN toevoegen aan query met subquery met inline selectie-instructie

Zonder enige DDL-statements die de tabellen definiëren, is het moeilijk te testen, maar:

  1. U vergelijkt datums met strings - Oracle voert waarschijnlijk een impliciete conversie terug naar een datum met de waarde van de NLS_DATE_FORMAT sessieparameter (wat hopelijk DD-MON-YY is) ) maar als dit ooit verandert, zal het de query verbreken (en de query zal niet zijn veranderd, dus het zal lastig zijn om te debuggen). Stop met het gebruik van strings als datums en gebruik letterlijke datums - bijv. DATE '2016-01-01' .
  2. Je hebt de eerste HAVING clausule vóór de GROUP BY clausule - wissel ze om.
  3. Je mengt ook een oude komma-join en ANSI-join - vervang de komma-join door een INNER JOIN en verplaats de join-voorwaarde uit de WHERE clausule.
  4. Groepering op A.TRADING_DWKEY||A.RM_SM_USER_CODE is inefficiënt. Je hebt al A.TRADING_DWKEY als een van de GROUP BY termen dus voeg de tekenreeksen niet samen, maar voeg gewoon de andere kolom toe aan de GROUP BY clausule.

Iets als:

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. Hoe kan ik tijd besparen in de database in Go bij gebruik van GORM en Postgresql?

  2. Draaien met SQL Server 2000

  3. Wat is het verschil tussen Oracle en Mysql bij het interpreteren van Create Database?

  4. Query met meerdere waarden in een kolom