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

動的テーブル設計 (一般的なルックアップ テーブル)、値を取得するための優れたクエリが必要

    最初はこれがあります -- これは非常に厄介です。

    少しクリーンアップするために、2 つのビューとシノニムを追加します。

    create view v_Value as
    select
          ID                      as ValueID
        , tb_modules_ID           as ModuleID
        , usertype_OR_religion_ID as RemoteID
    from tb_value ;
    go
    
    create view v_Religion as
    select
          ID
        , ReligionName as Title
    from tb_religion ;
    go
    
    create synonym v_UserType for tb_UserType ;
    go
    

    モデルは次のようになります

    クエリの記述が簡単になりました

    ;
    with 
    q_mod as (
        select
              m.ID                          as ModuleID
            , coalesce(x1.ID    , x2.ID)    as RemoteID
            , coalesce(x1.Title , x2.Title) as Title
            , m.Description                 as ModuleType
        from      tb_Modules as m
        left join v_UserType as x1 on m.TableName = 'tb_UserType'
        left join v_Religion as x2 on m.TableName = 'tb_Religion'
    )
    select
          a.ModuleID
        , v.ValueID
        , a.RemoteID
        , a.ModuleType
        , a.Title
    from q_mod   as a
    join v_Value as v on (v.ModuleID = a.ModuleID and v.RemoteID = a.RemoteID) ;
    

    このクエリには明らかなパターンがあるため、別のモジュール タイプのテーブルを追加する必要がある場合は、動的 SQL として作成できます。別のテーブルを追加するときは、ID を使用します および Title ビューを使用する必要がないようにします。

    編集

    動的 SQL (またはアプリケーション レベルでのクエリ) を構築するには

    6 行目と 7 行目を変更します。x-index は tb_modules.id です。

    coalesce(x1. , x2. , x3. ..) 
    

    左結合に行を追加します (行 11 の下)

    left join v_SomeName as x3  on m.TableName = 'tb_SomeName'
    

    SomeName tb_modules.description です x-index は tb_modules.id と一致しています

    編集 2

    最も簡単な方法は、おそらく上記のクエリをビューにパッケージ化し、スキーマが動的に変更されるたびに ALTER VIEW をクレートして実行することです。 .このようにして、クエリはアプリケーションの時点から変更されません。



    1. utf8_general_ciとutf8_unicode_ciの違いは何ですか?

    2. 認証タイプ10がサポートされていないため、PostgresDBに接続できません

    3. 動的SQLエラー:「CREATETRIGGER」はクエリバッチの最初のステートメントである必要があります

    4. MariaDBのHOUR()とEXTRACT(HOUR…):違いは何ですか?