Oracle
 sql >> база данни >  >> RDS >> Oracle

Добавяне на INNER JOIN към заявка с подзаявка с вграден оператор за избор

Без никакви DDL изрази, дефиниращи таблиците, е трудно да се тества, но:

  1. Сравнявате дати с помощта на низове - Oracle вероятно извършва имплицитно преобразуване обратно към дата, използвайки стойността на NLS_DATE_FORMAT параметър на сесията (който се надяваме да е DD-MON-YY ), но ако това някога се промени, това ще прекъсне заявката (и заявката няма да се е променила, така че ще бъде трудно да се отстранят грешки). Спрете да използвате низове като дати и използвайте литерали за дати - т.е. DATE '2016-01-01' .
  2. Имате първия HAVING клауза преди GROUP BY клауза - разменете ги.
  3. Също така смесвате наследено съединение със запетая и ANSI съединение - заменете съединението със запетая с INNER JOIN и преместете условието за присъединяване извън WHERE клауза.
  4. Групиране по A.TRADING_DWKEY||A.RM_SM_USER_CODE е неефективно. Вече имате A.TRADING_DWKEY като един от GROUP BY условия, така че не свързвайте низовете, просто включете другата колона в GROUP BY клауза.

Нещо като:

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. Коя таблица на Oracle използва последователност?

  2. разлика между tab table и all_tables в oracle

  3. Попълване на асоциативен масив във вложена таблица

  4. Създайте редактируем изглед на Oracle

  5. Как да регистрирам/проследя извиквания на съхранени процедури на Oracle със стойности на параметри?