2012-05-30 91 views
3

我有tbl1Sql Server中的Cell to Cell比較?

Id | c1 | c2 | c3 | 
    ____|_____|______|_______|_ 
    1  a  b  c 
    ____|_____|______|_______|_ 
    2  h  j  k 
    ____|_____|______|_______|_ 
    3  t  y  u 
    ____|_____|______|_______|_ 

我有tbl2

Id | c1 | c2 | c3 | 
    ____|_____|______|_______|_ 
    1  a  b  D 
    ____|_____|______|_______|_ 
    2  c  c  c 
    ____|_____|______|_______|_ 
    3  k  l  k 
    ____|_____|______|_______|_ 

我需要每個單元從tbl1tbl2比較其適當位置:

期望的輸出是:

Id |tbl1 | tbl2 | 
    ____|_____|______| 
    1  a  a  
    ____|_____|______| 
    1  b  b  
    ____|_____|______| 
    1  c  d  
    ____|_____|______| 
    2  h  c  
    ____|_____|______| 
    2  j  c  
    ____|_____|______| 
    2  k  c  
    ____|_____|______| 
      ... 
      ... 
      ... 
      ... 

可視化表示:

enter image description here

我試過很多疑問......但沒有成功......

回答

2
select T1.id, T1.tbl1, T2.tbl2 
from (
     select U.id, U.tbl1, U.col 
     from tbl1 
     unpivot (tbl1 for col in (c1, c2, c3)) U 
    ) T1 
    inner join 
    (
     select U.id, U.tbl2, U.Col 
     from tbl2 
     unpivot (tbl2 for col in (c1, c2, c3)) U 
    ) T2 
    on T1.id = T2.id and 
     T1.col = T2.col 
order by T1.id 
+0

只是爲了觀看和學習.....謝謝。 –

+0

我很想聽聽你對於http://stackoverflow.com/questions/11602414/count-events-in-sql-server的想法 –

2

首先,你應該unpivot的數據:

select Id, C1, 'C1' as C from tbl1 union all 
    select Id, C2, 'C2' as C from tbl1 union all 
    select Id, C3, 'C2' as C from tbl1 union all 

然後你就可以比較數據:

select coalesce(uTbl1.Id,uTbl2.Id) as Id, uTbl1.C, uTbl2.C 
    from (
    select Id, C1 as C, 'C1' as T from tbl1 union all 
    select Id, C2 as C, 'C2' as T from tbl1 union all 
    select Id, C3 as C, 'C3' as T from tbl1) uTbl1 
    full outer join (
    select Id, C1 as C, 'C1' as T from tbl2 union all 
    select Id, C2 as C, 'C2' as T from tbl2 union all 
    select Id, C3 as C, 'C3' as T from tbl2) uTbl2 
     on uTbl1.Id = uTbl2.Id and uTbl1.T = uTbl2.T 

免責聲明: - 未經測試。

編輯隨着CTE:

; with 
    uTbl1 as (
    select Id, C1 as C, 'C1' as T from tbl1 union all 
    select Id, C2 as C, 'C2' as T from tbl1 union all 
    select Id, C3 as C, 'C3' as T from tbl1) 
    ,uTbl2 as (
    select Id, C1 as C, 'C1' as T from tbl2 union all 
    select Id, C2 as C, 'C2' as T from tbl2 union all 
    select Id, C3 as C, 'C3' as T from tbl2) 
    select coalesce(uTbl1.Id,uTbl2.Id) as Id, uTbl1.C, uTbl2.C 
    from 
     uTbl1 
    full outer join 
     uTbl2 
     on uTbl1.Id = uTbl2.Id and uTbl1.T = uTbl2.T 
+0

SQL Server 2005的熱膨脹係數有 – Lamak

+0

@Lamak,謝謝,轉移到CTE版本。 – danihp

1

做3個原子子查詢,然後使用具有UNION ALL得到最終的結果是:

SELECT tbl1.id, tbl1.c1, tbl2.c1 FROM tbl1 
INNER JOIN tbl2 on tbl1.id = tbl2.id 

UNION ALL 

SELECT tbl1.id, tbl1.c2, tbl2.c2 FROM tbl1 
INNER JOIN tbl2 on tbl1.id = tbl2.id 

UNION ALL 

SELECT tbl1.id, tbl1.c3, tbl2.c3 FROM tbl1 
INNER JOIN tbl2 on tbl1.id = tbl2.id 

ORDER BY 1 --sort by column 1 (the IDs) 
+0

要完成,您應該將第一個選擇中的第二列和第三列別名爲[tbl1]和[tbl2]。此外,我更喜歡避免使用ORDER BY 1語法(因爲它將被棄用)並將其更改爲ORDER BY id,tbl1。 – GilM