sql >> Databáze >  >> RDS >> Oracle

Přidání INNER JOIN do dotazu s poddotazem s příkazem Inline Select

Bez jakýchkoli příkazů DDL definujících tabulky je obtížné testovat, ale:

  1. Porovnáváte data pomocí řetězců – Oracle pravděpodobně provádí implicitní převod zpět na datum pomocí hodnoty NLS_DATE_FORMAT parametr session (což je doufejme DD-MON-YY ), ale pokud se to někdy změní, přeruší to dotaz (a dotaz se nezmění, takže bude obtížné ladit). Přestaňte používat řetězce jako data a používejte datové literály – tj. DATE '2016-01-01' .
  2. Máte první HAVING klauzule před GROUP BY klauzule – vyměňte je.
  3. Mícháte také starší spojení čárkou a spojení ANSI – nahraďte spojení čárkou spojením INNER JOIN a přesuňte podmínku spojení z WHERE doložka.
  4. Seskupit podle A.TRADING_DWKEY||A.RM_SM_USER_CODE je neefektivní. A.TRADING_DWKEY již máte jako jeden z GROUP BY výrazy, takže řetězce nezřetězujte, pouze zahrňte druhý sloupec do GROUP BY doložka.

Něco jako:

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. Co mohu udělat, aby tento SQL v určitých situacích vrátil výsledky?

  2. Kolejnice 3.1. Heroku PGError:operátor neexistuje:znak proměnlivý =celé číslo

  3. MySQL Trigger - smazat po aktualizaci

  4. Jak vytvořit tabulky s hesly v mysql?