0

我有带有连接语句的选择语句查询,我用它来从加入表中获取价值

这是我的选择查询:

select 
case when p1.Value2 is not null then p1.Value3 end as fix1,
case when p1.Value2 is not null then p2.Value3 end as fix2,
case when p1.Value2 is not null then p3.Value3 end as fix3,
case when p1.Value2 is not null then p4.Value3 end as fix4,
case when p1.Value2 is not null then p5.Value3 end as fix5,
case when p1.Value2 is not null then p6.Value3 end as fix6
from tc t
left join (select * from  Parameter where paramtype='fix') as p1 on p1.Value2 = t.FIX 
left join (select * from  Parameter where paramtype='fix') as p2 on p2.Value2 = t.FIX1
left join (select * from  Parameter where paramtype='fix') as p3 on p3.Value2 = t.FIX2
left join (select * from  Parameter where paramtype='fix') as p4 on p4.Value2 = t.FIX3
left join (select * from  Parameter where paramtype='fix') as p5 on p5.Value2 = t.FIX4
left join (select * from  Parameter where paramtype='fix') as p6 on p6.Value2 = t.FIX5
where CUST_ACCT ='10053996'

我认为它很复杂,所以我像这样更改我的代码:

select 
fix +' '+(select Value3 from Parameter where ParamType = 'fix' and Value2 = fix) as fix,
FIX1 +' '+(select Value3 from Parameter where ParamType = 'fix' and Value2 = FIX1) as FIX1,
FIX2 +' '+(select Value3 from Parameter where ParamType = 'fix' and Value2 = FIX2) as FIX2,
FIX3 +' '+(select Value3 from Parameter where ParamType = 'fix' and Value2 = FIX3) as FIX3,
FIX4 +' '+(select Value3 from Parameter where ParamType = 'fix' and Value2 = FIX4) as FIX4,
FIX5 +' '+(select Value3 from Parameter where ParamType = 'fix' and Value2 = FIX5) as FIX5
from tc where CUST_ACCT ='10053996'

是否可以简化我的代码?或者如果我想做这样的事情,我应该像这样创建选择语句?

4

4 回答 4

3

这样的解决方案怎么样?

SELECT /*extra fields from tc ==>>*/ x, y /*<<==*/
    , FIX, FIX1, FIX2, FIX3, FIX4, FIX5
FROM (
    SELECT fields, P.Value3, /*extra fields from tc ==>>*/ x, y /*<<==*/
    FROM (
        SELECT *
        FROM tc
        WHERE CUST_ACCT ='10053996'
    ) T
    UNPIVOT (
        unpvt FOR fields in (FIX,FIX1,FIX2,FIX3,FIX4,FIX5)
    ) UPV
    LEFT JOIN Parameter P ON P.paramtype='fix' AND P.Value2 = UPV.unpvt
) T
PIVOT (
    MIN(Value3) FOR fields in (FIX,FIX1,FIX2,FIX3,FIX4,FIX5)
) AS PV
于 2013-11-13T08:29:34.940 回答
1

您可以在第一个语句中替换CaseStatement IsNull(expression, valueIfNull)

我有带有连接语句的选择语句查询,我用它来从加入表中获取价值

这是我的选择查询:

select 
IsNull(p1.Value2 ,p1.Value3) as fix1,
IsNull(p1.Value2 ,p1.Value3) as fix2,
IsNull(p1.Value2 ,p1.Value3) as fix3,
IsNull(p1.Value2 ,p1.Value3) as fix4,
IsNull(p1.Value2 ,p1.Value3) as fix5,
IsNull(p1.Value2 ,p1.Value3) as fix6,
from tc t
left join (select * from  Parameter where paramtype='fix') as p1 on p1.Value2 = t.FIX 
left join (select * from  Parameter where paramtype='fix') as p2 on p2.Value2 = t.FIX1
left join (select * from  Parameter where paramtype='fix') as p3 on p3.Value2 = t.FIX2
left join (select * from  Parameter where paramtype='fix') as p4 on p4.Value2 = t.FIX3
left join (select * from  Parameter where paramtype='fix') as p5 on p5.Value2 = t.FIX4
left join (select * from  Parameter where paramtype='fix') as p6 on p6.Value2 = t.FIX5
where CUST_ACCT ='10053996'
于 2013-11-13T07:41:20.977 回答
1

您绝对不需要多次加入同一张桌子。这是避免它的简单技巧:

select 
case when pt.f = 1 then pt.Value3 end as fix1,
case when pt.f2 = 1 then pt.Value3 end as fix2,
... 
from tc
left join (select 
      CASE WHEN p.Value2 = t.FIX THEN 1 ELSE 0 END AS f, 
      CASE WHEN p.Value2 = t.FIX1 THEN 1 ELSE 0 END AS f1, 
      CASE WHEN p.Value2 = t.FIX2 THEN 1 ELSE 0 END AS f2, 
      CASE WHEN p.Value2 = t.FIX3 THEN 1 ELSE 0 END AS f3, 
      CASE WHEN p.Value2 = t.FIX4 THEN 1 ELSE 0 END AS f4, 
      CASE WHEN p.Value2 = t.FIX5 THEN 1 ELSE 0 END AS f5
    from  Parameter AS p where paramtype = 'fix') AS pt
    ON pt.Value2 IN (tc.FIX, tc.FIX2, tc.FIX3, tc.FIX4, tc.FIX5)
where CUST_ACCT ='10053996'

可能你可以JOIN根据你的具体情况简化 - 条件。这个想法是引入参数而不是多个连接。

于 2013-11-13T08:30:30.163 回答
0

怎么样:

select
case when p1.Value2 is not null then p1.Value3 end as fix1,
case when p1.Value2 is not null then p2.Value3 end as fix2, 
case when p1.Value2 is not null then p3.Value3 end as fix3, 
case when p1.Value2 is not null then p4.Value3 end as fix4, 
case when p1.Value2 is not null then p5.Value3 end as fix5, 
case when p1.Value2 is not null then p6.Value3 end as fix6 
from tc t 
left join Parameter as p1 
on p1.Value2 = t.FIX  AND p1.paramtype='fix'  
left join Parameter as p2 
on p2.Value2 = t.FIX1 AND p2.paramtype='fix'  
left join Parameter as p3
on p3.Value2 = t.FIX2 AND p3.paramtype='fix' 
left join Parameter as p4
on p4.Value2 = t.FIX3 AND p4.paramtype='fix' 
left join Parameter as p5
on p5.Value2 = t.FIX4 AND p5.paramtype='fix' 
left join Parameter as p6
on p6.Value2 = t.FIX5 AND p6.paramtype='fix' 
where CUST_ACCT ='10053996'
于 2013-11-13T11:17:20.017 回答