SQL - 使用子选择

问题描述:

我有一个包含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.我假设在这里需要子选择?

它返回的最高值阻塞在任本身或其父母的账户,如果它有一个父帐户

您可以添加一个写这样的查询,因为只有当你只有一个级别(例如父 - >子)

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

这是一个有点乱。 这是“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

使用此:

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