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;
または、再帰の代わりにループを使用するように作成することもできます。