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

履歴変更テーブルからエンティティを選択するための SQL クエリ

    私が読んだことから、日付範囲内でステータスが 1 のすべての会社が必要であると想定しています。これがあなたの望むものなら、それはとても簡単です。

    次のステートメントは、仕事をする必要があります:

    SELECT C.*
      FROM COMPANY C
      LEFT JOIN ( SELECT H.STATUS, H.COMPANY_ID
                    FROM COMPANYSTATUS H
                   WHERE H.STATUS_EFFECTIVE_DATE = (SELECT MAX(H1.STATUS_EFFECTIVE_DATE)
                                                      FROM COMPANYSTATUS H1
                                                     WHERE H1.COMPANY_ID = H.COMPANY_ID
                                                       AND H1.STATUS_EFFECTIVE_DATE <= '20171231'
                 ) CH ON CH.COMPANY_ID = C.ID   
     WHERE ( C.STATUS = 1 AND CH.COMPANY_ID IS NULL ) -- CASE #1 : STATUS = 1 AND NEVER CHANGED (NO HISTORY)
        OR H.STATUS = 1
    

    私が行ったことは、日付範囲の終わりまでの最後のステータスでネストされたビューを作成することでした。そのため、会社のステータスの最後の変更が 1 の場合、この会社は結果に含まれるはずです。日付範囲の後の変更は気にしないので、ネストされたビュー内に制限を入れました.

    このリクエストでは、範囲の開始は重要ではありません。他のテーブルに参加するために、おそらく他の目的で必要でした.

    私は Oracle 担当者なので、Oracle 分析を使用してこのステートメントをさらに改善できると思いますが、SQL サーバーに対しては有効なステートメントになると思います。



    1. 'mysqldump'を使用してすべてのテーブルをCSV形式でダンプします

    2. 複数のdb列にインデックスを付けるコストはいくらですか?

    3. MySQLで流暢なnHibernateを設定する方法

    4. 4000文字を超えるXMLをOracleXMLTYPE列に挿入します