sql >> Database teknologi >  >> RDS >> Oracle

Tilføjelse af INNER JOIN til forespørgsel med underforespørgsel med Inline Select-erklæring

Uden nogen DDL-sætninger, der definerer tabellerne, er det svært at teste, men:

  1. Du sammenligner datoer ved hjælp af strenge - Oracle laver sandsynligvis en implicit konvertering tilbage til en dato ved hjælp af værdien af ​​NLS_DATE_FORMAT sessionsparameter (som forhåbentlig er DD-MON-YY ), men hvis dette nogensinde ændrer sig, vil det bryde forespørgslen (og forespørgslen vil ikke have ændret sig, så det vil være en smerte at fejlfinde). Stop med at bruge strenge som datoer, og brug bogstaver for dato - dvs. DATE '2016-01-01' .
  2. Du har den første HAVING klausul før GROUP BY klausul - skift dem rundt.
  3. Du blander også en ældre komma-join og ANSI-join - erstat komma-join med en INNER JOIN og flyt forbindelsesbetingelsen ud af WHERE klausul.
  4. Grupper efter A.TRADING_DWKEY||A.RM_SM_USER_CODE er ineffektiv. Du har allerede A.TRADING_DWKEY som en af ​​GROUP BY termer, så lad være med at sammenkæde strengene, bare medtag den anden kolonne i GROUP BY klausul.

Noget som:

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. Tilslutning til en ekstern database fra en lokal værtscomputer ved hjælp af mysql og PHP

  2. Endeløs sløjfe i triggerfunktion

  3. SQL:forskel mellem to datoer

  4. Tjek rækker for monotont stigende værdier