2016-11-02 127 views
0

我有兩個來自兩個不同數據庫的表(相同的結構),如果可能的話,我想用一個查詢來合併。查詢幫助合併兩個表

我試圖檢索所有不同的序列號及其項目名稱和兩個類別標識符。序列號存儲在4個字段中。另一個問題是名稱和類別字段在兩個表之間不會總是相同(即使它們應該是 - 但這是另一個問題)。所以,我希望查詢從第一個表中返回不同的SN和名稱和cat字段。

於是我開始:

SELECT 
LEFT(NUMBR_1,4) + '-' + LEFT(NUMBR_2,4) + '-' + LEFT(NUMBR_3,3) + '-' + LEFT(NUMBR_4,5) AS SN 
,DESCR 
,TYP 
,ATNUM 
FROM DB1.dbo.table1 
UNION 
SELECT 
LEFT(NUMBR_1,4) + '-' + LEFT(NUMBR_2,4) + '-' + LEFT(NUMBR_3,3) + '-' + LEFT(NUMBR_4,5) AS SN 
,DESCR 
,TYP 
,ATNUM 
FROM DB2.dbo.table2 

從那裏我會手動完成在Excel的整合和數據反饋到必要的報告。我希望只使用SQL來獲得最終結果,但這樣做超出了我的技能範圍。

我在另一個選擇中包裝了上述查詢以獲得不同或由SN組成的羣組 - 這使我得到SN的最終綜合列表。然而,因爲這些值本身並不是我可以用來從第一個表中查詢其他字段的東西(至少我能弄清楚),所以我不知道如何繼續。任何幫助,將不勝感激。謝謝。

+0

你能提供的'創建table'腳本和一些虛擬數據一個期望的輸出來說明你的要求,並提供給我們一些工作? – iamdave

+0

@Jason Kimbel你的意思是你無法從內部查詢中訪問外部查詢中的字段? –

回答

0
SELECT 
    LEFT(NUMBR_1,4) + '-' + LEFT(NUMBR_2,4) + '-' + LEFT(NUMBR_3,3) + '-' + LEFT(NUMBR_4,5) AS SN, 
    ,coalesce(t1.DESCR, t2.DESCR) DESCR, 
    ,coalesce(t1.TYP, t2.TYP) TYP 
    ,coalesce(t1.ATNUM, t2.ATNUM) ATNUM 
FROM DB1.dbo.table1 t1 
FULL JOIN DB2.dbo.table2 t2 ON 
    t1.NUMBR_1 = t2.NUMBR_1 AND t1.NUMBR_2 = t2.NUMBR_2 AND t1.NUMBR_3 = t2.NUMBR_3 AND t1.NUMBR_4 = t2.NUMBR_4 
+0

謝謝!那就是訣竅。不得不爲SN使用coalesce。 –

0

與喬爾誰打敗了我,雖然這將實際上運行類似的答案。只需換出@t1@t2即可。 FULL JOIN期從兩個表中返回的所有記錄,並在沒有匹配,返回NULL S代表一方和其他無與倫比的價值:

declare @t1 table (numbr_1 int 
        ,numbr_2 int 
        ,numbr_3 int 
        ,numbr_4 int 
        ,descr nvarchar(50) 
        ,typ nvarchar(50) 
        ,atnum int 
        ); 

declare @t2 table (numbr_1 int 
        ,numbr_2 int 
        ,numbr_3 int 
        ,numbr_4 int 
        ,descr nvarchar(50) 
        ,typ nvarchar(50) 
        ,atnum int 
        ); 

insert into @t1 values 
(1,1,1,1,'d1','t1',1) 
,(1,1,1,2,'d2','t1',1) 
,(1,1,1,3,'d3','t2',2) 
,(1,1,2,1,'d4','t2',3) 
,(1,1,2,2,'d5','t2',4); 

insert into @t2 values 
(1,1,1,1,'d6','t1',1) 
,(1,1,1,2,'d7','t3',1) 
,(1,2,1,3,'d8','t4',2) 
,(1,2,2,1,'d9','t4',3) 
,(1,2,2,2,'d5','t2',4); 

select coalesce(left(t1.numbr_1,4) + '-' + left(t1.numbr_2,4) + '-' + left(t1.numbr_3,4) + '-' + left(t1.numbr_4,4) 
       ,left(t2.numbr_1,4) + '-' + left(t2.numbr_2,4) + '-' + left(t2.numbr_3,4) + '-' + left(t2.numbr_4,4) 
       ) as ID 
     ,coalesce(t1.descr,t2.descr) as descr 
     ,coalesce(t1.typ,t2.typ) as typ 
     ,coalesce(t1.atnum,t2.atnum) as atnum 
from @t1 t1 
    full join @t2 t2 
     on(t1.numbr_1 = t2.numbr_1 
      and t1.numbr_2 = t2.numbr_2 
      and t1.numbr_3 = t2.numbr_3 
      and t1.numbr_4 = t2.numbr_4 
      );