我有一个包含3行的表:AccountNum,InvoiceAcc和Blocked。我的表中的大多数行都有InvoiceAcc但不是全部。 AccountNum是唯一标识符,并且可以使多个AccountNum具有相同的InvoiceAcc。 Blocked是一个从0,1和2变化的int值。
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.我假设这里需要一个子选择?
如果它有父帐户
,它应该根据自身或其父帐户返回最高的阻止值答案 0 :(得分: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'
答案 1 :(得分:0)
这有点乱。 这是“1-?”那让你搞砸了。
ParentAccount = 1,SubAccount = 2,将解析
然后你可以通过ParentAccount选择像
这样的东西Select parent.Blocked From SomeTable parent
inner join SomeTable Children On Parent.ParentAccount = Child.ParentAccount
保持你当前的结构,你将不得不想出一堆字符串函数来从“A-C”中提取A
答案 2 :(得分:0)
使用此:
select AccountNum ,(select count(*) from CustTable where AccountNum like t.AccountNum +'-%') as Totalsubacc from CustTable t where AccountNum not like '%-%'