Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dodawanie INNER JOIN do zapytania z podzapytaniem z instrukcją Inline Select

Bez żadnych instrukcji DDL definiujących tabele trudno jest przetestować, ale:

  1. Porównujesz daty za pomocą ciągów znaków — Oracle prawdopodobnie dokonuje niejawnej konwersji z powrotem na datę przy użyciu wartości NLS_DATE_FORMAT parametr sesji (który, miejmy nadzieję, to DD-MON-YY ), ale jeśli to się kiedykolwiek zmieni, spowoduje to przerwanie zapytania (a zapytanie nie ulegnie zmianie, więc debugowanie będzie trudne). Przestań używać ciągów jako dat i używaj literałów daty - np. DATE '2016-01-01' .
  2. Masz pierwszy HAVING klauzula przed GROUP BY klauzula - zamień je.
  3. Łączysz również starsze złączenie przecinkowe i złączenie ANSI - zastąp to złączenie przecinkiem INNER JOIN i przenieś warunek złączenia poza WHERE klauzula.
  4. Grupowanie według A.TRADING_DWKEY||A.RM_SM_USER_CODE jest nieefektywny. Masz już A.TRADING_DWKEY jako jeden z GROUP BY terminy, więc nie łącz ciągów, po prostu uwzględnij drugą kolumnę w GROUP BY klauzula.

Coś takiego:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dodaj kwoty z dwóch różnych tabel Oracle

  2. Iteruj po wierszach drugiej tabeli, aby zwrócić zestaw wyników

  3. SQL nie wyświetla wartości null w zapytaniu nie równa się?

  4. Jaka jest różnica między CLOB a NCLOB?

  5. 2 sposoby zwracania wierszy, które nie zawierają wartości liczbowych w Oracle