2013-06-01 102 views
0

我有一个数据枢轴连接的表SQL Server上

TAB1

--------------------------------------------- 
    | ID1 | ID2 | SIGNEDBY | A | B | C | 
    | 1 | 8 | 'aa' |'John' | 9 | 12/12 | 
    | 2 | 9 | 'bb' |'Smith' | 0 | 13/12 | 

TAB2

------------------------------------------------------------------- 
    | NAME | ID1 | ID2 | SIGNEDBY | VSTRING | VINT | VDATA | D | E | 
    | 'C1' | 1 | 8 | 'aa' | NULL | 1 | NULL | 'l'| 5 | 
    | 'C2' | 1 | 8 | 'aa' | 'sth' | NULL | NULL | 'p'| 4 | 
    | 'C3' | 1 | 8 | 'aa' | NULL | NULL | 12/1/13 | 'q'| 5 | 
    | 'C2' | 2 | 9 | 'bb' | 'oth' | NULL | NULL | 'p'| 4 | 
    | 'C3' | 2 | 9 | 'bb' | NULL | NULL | 1/1/11 | 'q'| 5 | 

我需要的,这将产生一个查询两个表

TAB3

---------------------------------------------------- 
    | ID1 | ID2 | A | B | C1 | C2 | c3 | 
    | 1 | 8 | 'John' | 9 | 1 | 'sth' | 12/1/13 | 
    | 2 | 9 | 'Smith'| 0 | NULL | 'oth' | 1/1/11 | 

首先我想在本地创建TAB3,插入数据形成TAB1到TAB3,然后为每个我叫名字“合并为表”。它工作正常,但速度太慢(超过4分钟)。然后我尝试了一个查询,如:

Select ID1, ID2, A, (Select VINT from TAB3 where Name - 'C1' and ....) 'C1', 
    .... from TAB1 

这也是工作正常,但仍然太慢。然后我遇到了pivot命令,但是我没有设法编写一个工作代码。是否可以为这个问题编写一个快速查询(理想情况下是一个)?

+0

能否请你解释一下输出你想?此外,[SQLFiddle](http://sqlfiddle.com)中的示例将非常棒。 – vidit

+0

TAB1上的哪个字段标识TAB2上的对应字段 - ID1,ID2和/或SIGNEDBY? –

+0

字段ID1,ID2,SIGNEDBY对应于TAB1和TAB2之间 – orwe

回答

0

这里的另一种选择使用MAXPIVOT你的结果与CASE不需要加入表回自己:

select t.id1, t.id2, t.a, t.b, 
    max(case when t2.name = 'C1' then t2.vint end) c1, 
    max(case when t2.name = 'C2' then t2.vstring end) c2, 
    max(case when t2.name = 'C3' then t2.vdata end) c3 
from tab1 t 
    left join tab2 t2 on t.id1 = t2.id1 and t.id2 = t2.id2 
group by t.id1, t.id2, t.a, t.b 
0

尝试:

select t.id1, t.id2, t.a, t.b, c1.vint c1, c2.vstring c2, c3.vdata c3 
from tab1 t 
left join tab2 c1 
    on t.id1=c1.id1 and t.id2=c1.id2 and t.signedby=c1.signedby and c1.name='C1' 
left join tab2 c2 
    on t.id1=c2.id1 and t.id2=c2.id2 and t.signedby=c2.signedby and c2.name='C2' 
left join tab2 c3 
    on t.id1=c3.id1 and t.id2=c3.id2 and t.signedby=c3.signedby and c3.name='C3'