sql >> データベース >  >> RDS >> Oracle

インラインSelectステートメントを使用したサブクエリを使用したクエリへの内部結合の追加

    テーブルを定義する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の1つとして 用語なので、文字列を連結しないでください。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. BEFOREINSERTトリガーでIFEXISTS(SELECT ...)を使用する(Oracle)

    2. mysql.hがなく、mysql-develを見つけようとしています

    3. 異なるクラスにRelation::morphMap()を使用する方法

    4. ユーザーのパスワードとソルトをMySQLに安全に保存するにはどうすればよいですか?