sql - Scope of derived tables -
i have complex sql query, we'll need return number of columns, , each represents different row table. derived tables need filtered value, bring ones account. following works great:
select currentbalance.value, currentbalance.customer, debt30balance.value expr1, debt30balance.customer expr2, debt60balance.value expr3, debt60balance.customer expr4, debt90balance.value expr5, debt90balance.customer expr6, wipcurrent.value expr7, wipcurrent.customer expr8, wip30days.value expr9, wip30days.customer expr10, wip60days.value expr11, wip60days.customer expr12, wip90days.value expr13, wip90days.customer expr14 (select top (1) value, customer debtbreakdown ( customer = @customerid ) , ( type = 0 ) order timestamp desc) currentbalance inner join (select top (1) value, customer debtbreakdown debtbreakdown_7 ( customer = @customerid ) , ( type = 1 ) order timestamp desc) debt30balance on currentbalance.customer = debt30balance.customer inner join (select top (1) value, customer debtbreakdown debtbreakdown_6 ( customer = @customerid ) , ( type = 2 ) order timestamp desc) debt60balance on debt30balance.customer = debt60balance.customer inner join (select top (1) value, customer debtbreakdown debtbreakdown_5 ( customer = @customerid ) , ( type = 3 ) order timestamp desc) debt90balance on debt60balance.customer = debt90balance.customer inner join (select top (1) value, customer debtbreakdown debtbreakdown_4 ( customer = @customerid ) , ( type = 4 ) order timestamp desc) wipcurrent on debt90balance.customer = wipcurrent.customer inner join (select top (1) value, customer debtbreakdown debtbreakdown_3 ( customer = @customerid ) , ( type = 5 ) order timestamp desc) wip30days on wipcurrent.customer = wip30days.customer inner join (select top (1) value, customer debtbreakdown debtbreakdown_2 ( customer = @customerid ) , ( type = 6 ) order timestamp desc) wip60days on wip30days.customer = wip60days.customer inner join (select top (1) value, customer debtbreakdown debtbreakdown_1 ( customer = @customerid ) , ( type = 7 ) order timestamp desc) wip90days on wip60days.customer = wip90days.customer
but, need able filter on other given parameter. basically, want select customer record, given parameter such name of customer, select id use derived tables. i've tried join's derived tables not in scope of joins.
any ideas?
if on @ least sql server 2005 (as seems bracketed top
expression) can use common table expressions instead of derived tables.
/*any previous statement must terminated semi colon*/ currentbalance (select top (1) value, customer debtbreakdown ( customer = @customerid ) , ( type = 0 ) order timestamp desc), /*comma delimit cte definitions*/ debt30balance (select top (1) value, customer debtbreakdown debtbreakdown_7 ( customer = @customerid ) , ( type = 1 ) order timestamp desc) /* etc etc */
you can reference ctes multiple times in same query.
Comments
Post a Comment