我有两个数据表
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,然后为每个名为“MERGE INTO Table”的NAME插入。它工作正常但速度太慢(超过4分钟)。然后我尝试了一个类似的查询:
Select ID1, ID2, A, (Select VINT from TAB3 where Name - 'C1' and ....) 'C1',
.... from TAB1
这也工作正常,但仍然太慢。然后我遇到了pivot命令,但我没有设法编写一个正常工作的代码。是否有可能为这个问题写一个快速查询(最好是一个)?
答案 0 :(得分: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'
答案 1 :(得分:0)
以下是使用PIVOT
MAX
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
不需要将表格重新连接到自身:
{{1}}