2016-08-02 73 views
2

我有一個'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返回的所有父帳戶及其「第一個孩子」的列表未排序?

+1

重寫你的問題。提供腳本(僅適用於相關列)和一致的樣本數據(向下滾動並看到'80005217'以及它仍然對我們不可見)和期望的輸出,因此我們可以輕鬆地重新創建並測試我們的想法。 –

+0

如何在這些表上插入數據?你有沒有試過通過創建測試表和測試數據來重現這一點? –

+0

預測未排序查詢的結果在技術上是不可能的。即使您在每次運行查詢時都能得到相同的結果 - 也無法保證下次查詢嘗試訪問表時將首先選擇相同的行(因爲塊可能以不同的方式讀取然後命令)。如果需要能夠預測行返回的順序,請排序查詢。就那麼簡單。 –

回答

0

爲保證記錄按照固定順序進入,我們必須在ORDER BY子句中爲數據庫提供排序標準。如果沒有定義「第一性」的屬性,則不能保證。如果沒有ORDER BY子句,記錄基本上處於不受控制的順序,但由於數據庫內部的原因,它們通常會陷入某種模式。

那麼,是什麼讓帳戶80007325第一個孩子WHERE ACPARENT = '80005217'?顯然不是數字順序。還有其他的標準嗎?創建日期?旗幟專欄?似乎你需要與你的用戶交談。他們真的關心哪些記錄是第一個?所有的時間或只是在一些特定的報告?

如果用戶不能確定有沒有什麼可以做的標準......

...雖然我可能會隨時顯示它由ACCTNO數字排序CHILDACCOUNT。至少可以提供一致性,用戶將會習慣它。