2012-04-10 84 views
0

我有一個包含3行的表:AccountNum,InvoiceAcc和Blocked。大多數行我的表都有一個InvoiceAcc但不是全部。 AccountNum是唯一的標識符,它可能爲許多AccountNum擁有相同的InvoiceAcc。被阻止是一個int值,從0,1和2變化。SQL - 使用子選擇

InvoiceAcc是基於AccountNum的,因此可以將其視爲父辦公室,然後繼續處理子辦公室。

例如,原單位,像這樣:

AccountNum - 1, InvoiceAcc - null, Blocked - 2可能有一個孩子辦事處,像這樣:

AccountNum - 1-1, InvoiceAcc - 1, Blocked - 0 

AccountNum - 1-2, InvoiceAcc - 1, Blocked - 1 

我希望做的是檢查行和其隨後的InvoiceAcc AccountNum被屏蔽的值。因此,在我上面的例子,如果我做了查詢,像這樣:

SELECT BLOCKED FROM CustTable WHERE AccountNum = '1-1' 

它會返回0,因爲這是阻塞的價值。我希望它做的是返回2,因爲它具有較高的價值和它的父帳戶。另外,如果家長acc的阻塞值爲1,並且我查詢的子帳戶的阻塞值爲2,那麼它應該返回2.我假設在這裏需要子選擇?

它返回的最高值阻塞在任本身或其父母的賬戶,如果它有一個父帳戶

回答

1

您可以添加一個寫這樣的查詢,因爲只有當你只有一個級別(例如父 - >子)

SELECT CASE 
    WHEN child.blocked > COALESCE(parent.blocked,0) 
    THEN child.blocked 
    ELSE parent.blocked 
END as blocked 
FROM CustTable child 
LEFT JOIN CustTable parent ON child.InvoiceAcc = parent.AccountNum 
WHERE child.AccountNum = '1-1' 
+0

這對於accno = 1也是靜態的 – SMK 2012-04-10 11:28:03

+0

Nop,不是如果我用一個參數替換它,或者甚至完全刪除它,因爲這將顯示每個客戶的最高塊值 – CallumVass 2012-04-10 11:34:25

0

這是一個有點亂。 這是「1-?」這讓你感到困惑。

ParentAccount = 1,子帳戶= 2,將解決

然後,你可以通過ParentAccount與somethimng像

Select parent.Blocked From SomeTable parent 
inner join SomeTable Children On Parent.ParentAccount = Child.ParentAccount 

選擇保留當前的結構,你將不得不拿出一個一串字符串函數從「AC」提取一個

+0

你好,這是我開始前已經exsisted業務系統!它有成千上萬的顧客現在太晚了,現在不能改變! – CallumVass 2012-04-10 11:10:05

+0

好吧,看起來@Shoibib的答案會很接近。它不會像表現得那麼好。不是你第一次留下討厭的閃光,我已經做了很多他們。 – 2012-04-10 16:38:44

0

使用此:

select AccountNum ,(select count(*) from CustTable where AccountNum like t.AccountNum +'-%') as Totalsubacc from CustTable t where AccountNum not like '%-%'