要做到這一點的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
另一種方法是編寫實現單個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;
或者可以寫成使用循環而不是遞歸。
我需要澄清一下「重複這個過程」的一部分。你想重複什麼?如果訂閱選項記錄不存在,並且繼承不爲null,您究竟想要完成什麼?因爲我沒有看到重複這個過程的任何部分會有什麼不同的結果,並且只會是一個無限循環(除非你的意思是繼續檢查直到繼承爲空或者找到訂閱選項記錄,這將是一個非常餿主意)。 – Jim 2012-07-12 23:51:17
很抱歉,希望澄清一下,僅僅意味着重複使用在繼承中找到的subscriptionid的過程 – 2012-07-13 01:01:39
適當的[示例代碼](http://sscce.org/)(這裏是SQL語句)比任何ad hoc模式更有用,樣本數據格式。請使用'CREATE TABLE'和'INSERT ... VALUES'作爲樣本。所需的結果不需要作爲示例代碼呈現,因爲結果是代碼的輸出,而不是代碼本身。 – outis 2012-07-17 22:36:30