我有一個'ACCOUNTS'表,其中有ACCTNO和ACPARENT字段。一個帳戶可以是另一個帳戶的父母。一個帳戶可以有很多孩子。返回Oracle中的第一個'未排序'連接SQL
已經發現某些外部過程在某些報告和輸出中正在使用「第一個孩子」 - 但沒有任何特定孩子成爲「第一」的真正「原因」,只是代碼中的一個無意的錯誤。
解開這個問題的第一步 - 我需要一個可以重新運行的查詢(但不是經常的,所以優化並不是真正的因素),對於所有父母的賬號,他們的第一個孩子'是。
問題 - '第一個孩子'不一定與記錄ID有關。如果我運行下面的查詢,例如:
SELECT ACCTNO FROM ACCOUNTS WHERE ACPARENT = '80005217';
我得到的結果是:
ACCTNO
______
80007325
80007310
80007315
80007298
我絕對,100%確認爲這個特殊的例子,賬戶80007325的賬戶ID爲用作'第一個孩子'。
在另一面,如果我跑的天真查詢:
SELECT A1.ACCTNO, A2.ACCTNO AS CHILDACCOUNT FROM ACCOUNTS A1
INNER JOIN ACCOUNTS A2 ON A1.ACCTNO = A2.ACPARENT
WHERE A1.ACCTNO IN
(SELECT ACPARENT FROM ACCOUNTS);
那麼如果我向下滾動到80005217是父帳戶,我看到下面的列表:
CHILDACCOUNT
______
80007298
80007310
80007315
80007325
這是排序,即使它不是我想要的。
是否有一個查詢會讓我看到我想要的單個查詢的列表?由SQL返回的所有父帳戶及其「第一個孩子」的列表未排序?
重寫你的問題。提供腳本(僅適用於相關列)和一致的樣本數據(向下滾動並看到'80005217'以及它仍然對我們不可見)和期望的輸出,因此我們可以輕鬆地重新創建並測試我們的想法。 –
如何在這些表上插入數據?你有沒有試過通過創建測試表和測試數據來重現這一點? –
預測未排序查詢的結果在技術上是不可能的。即使您在每次運行查詢時都能得到相同的結果 - 也無法保證下次查詢嘗試訪問表時將首先選擇相同的行(因爲塊可能以不同的方式讀取然後命令)。如果需要能夠預測行返回的順序,請排序查詢。就那麼簡單。 –