1

私は3つのテーブルを持っています:

  • サブスクリプ
    ション
    SubscriptionIDSubscriptionName
    継承(NULLにすることができます)

  • SubscriptionOptions
    SubscriptionOptionID
    SubscriptionID
    OptionID
    OptionValue

  • オプション
    OptionIDOptionDefaultValue 説明
    _

複数のオプションとサブスクリプションIDを使用してクエリを渡す必要があります。これは、次のようなものです。

SELECT optionid, optionvalue WHERE subscriptionid = x AND options IN (a, b, c, d, e, f)

次のような再帰呼び出しを介してロジックによる継承を実装する必要があるのは私だけです。

if subscriptionoption exists for subscription id & optionid
    use subscriptionoption.optionvalue in the row
else
    if inherits is not NULL
        call this function using inherited subscription id
    else
        use options.optiondefaultvalue for that optionid
4

1 に答える 1

1

SQLでそれを行うには、階層クエリを組み込む必要があると思います。これがそのスイングですが、私はそれをテストすることができませんでした。

SELECT optionID, NVL( MAX(optionValue), MAX(optionDefaultValue) ) optionValue
FROM (SELECT optionID, optionDefaultValue, subscriptionID, inherits
        FROM options CROSS JOIN subscriptions
        WHERE optionID IN (a,b,c,d,e,f)
     )
     LEFT JOIN subscriptionOptions USING (optionId, subscriptionID)
START WITH subscriptionID = x
CONNECT BY PRIOR optionValue IS NULL
       AND subscriptionID = PRIOR inherits
       AND optionID = PRIOR optionID
GROUP BY optionID

もう1つのアプローチは、単一のsubscriptionIDとoptionIDの再帰ロジックを実装する関数を作成し、次のように呼び出すことです。

SELECT optionID, NVL( getSubscriptionOption( x, optionID), optionDefaultValue )
  FROM options
  WHERE optionID IN (a,b,c,d,e,f)

関数は次のようになります。

FUNCTION getSubscriptionOption( pSubID NUMBER, pOptID NUMBER )
  RETURN subscriptionOptions.optionValue%TYPE
  IS
    l_optionValue subscriptionOptions.optionValue%TYPE;
    l_inherits    subscriptionOptions.inherits%TYPE;
  BEGIN
    SELECT optionValue
      INTO l_optionValue
      FROM subscriptionOptions
      WHERE subscriptionID = pSubID
        AND optionID = pOptID;
    RETURN l_optionValue;
  EXCEPTION
    WHEN no_data_found THEN
      SELECT inherits
        INTO l_inherits
        FROM subscriptions
        WHERE subscriptionID = pSubID;
      IF inherits IS NULL THEN
        RETURN NULL;
      ELSE
        RETURN getSubscriptionOption( l_inherits, pOptID );
      END IF;
  END;

または、再帰の代わりにループを使用するように作成することもできます。

于 2012-07-13T01:44:38.400 に答える