67707


以下のようなテーブル構成でRESULT_NAMEのNAME1~3のいずれかが'TEST1'であり、  
TEST1に対応したRESULT_VALUE.VALUE1～3のいずれかを取得するSQLを実装することは可能でしょうか？  
DBMSはOracle 19cを想定しています。

なお、RESULT_VALUEとRESULT_NAMEの結合キーはIDカラムになります。

1.RESULT_VALUEテーブル

[code]

    +-----------+----+
    |  Column   | PK |
    +-----------+----+
    | ID        |  1 |
    | DETAIL_ID |  2 |
    | VALUE1    |    |
    | VALUE2    |    |
    | VALUE3    |    |
    +-----------+----+
    
[/code]

2.RESULT_NAMEテーブル

[code]

    +--------+----+
    | Column | PK |
    +--------+----+
    | ID     |  1 |
    | NAME1  |    |
    | NAME2  |    |
    | NAME3  |    |
    +--------+----+
    
[/code]

・RESULT_VALUEの値例

[code]

    +----+-----------+--------+--------+--------+
    | ID | DETAIL_ID | VALUE1 | VALUE2 | VALUE3 |
    +----+-----------+--------+--------+--------+
    |  1 |        01 | V01    | V02    | V03    |
    |  1 |        02 | V11    | V12    | V13    |
    |  1 |        03 | V21    | V22    | V33    |
    +----+-----------+--------+--------+--------+
    
[/code]

・RESULT_NAMEの値例

[code]

    +----+-------+-------+-------+
    | ID | NAME1 | NAME2 | NAME3 |
    +----+-------+-------+-------+
    |  1 | TEST1 | TEST2 | TEST3 |
    +----+-------+-------+-------+
    
[/code]


CC BY-SA 4.0
2020-06-16T03:01:43.107
67704
2020-06-25T16:38:48.520
2020-06-25T16:38:48.520
14334
9228
question
sql oracle
SQLでカラム値の意味が動的に変わる場合の絞り込み方法について


インデックスも効かずスマートな方法ではありませんが、`decode`か`case`を使うSQLで手っ取り早く実装することが可能です。

[code]

    -- 疑似テーブル定義
    with RESULT_VALUE as
        (select 1 ID, '01' DETAIL_ID, 'V01' VALUE1, 'V02' VALUE2, 'V03' VALUE3 from dual union all
         select 1 ID, '02' DETAIL_ID, 'V11' VALUE1, 'V12' VALUE2, 'V13' VALUE3 from dual union all
         select 1 ID, '03' DETAIL_ID, 'V21' VALUE1, 'V22' VALUE2, 'V23' VALUE3 from dual),
         RESULT_NAME as
        (select 1 ID, 'TEST1' NAME1, 'TEST2' NAME2, 'TEST3' NAME3 from dual)
    -- サンプルSQL
    select V.ID,
           V.DETAIL_ID,
           -- NAMExが 'TEST1' に該当する時、対応するVALUExを取得する
           decode('TEST1',
                  N.NAME1, V.VALUE1,
                  N.NAME2, V.VALUE2,
                  N.NAME3, V.VALUE3,
                  null)
    from   RESULT_NAME N, RESULT_VALUE V
    where  N.ID = V.ID
    
[/code]


CC BY-SA 4.0
2020-06-16T04:56:01.007
67707
2020-06-16T04:56:01.007
9820
67704
answer