2017-03-06 49 views
0

我有四個表要加入,我需要確定哪些表的數據來自結果中的列。我使用左外連接將Tbl1連接到Tbl2。我使用左外連接將Tbl1連接到Tbl3,並將Tbl1連接到Tbl4。SerialNo是我連接所有表的關鍵字段。結果需要指出數據來自哪個表。爲了匹配表格之間的結果,我希望識別出正確的表格。例如,在我的示例表中,我想要顯示Tbl2位於SerialNo爲ABC123,DEF987和HJK321的那些記錄的結果中。從多個SQL Server連接的結果中添加常量

由於數據將如何從數據庫中提取,我無法啓動存儲過程,因此我計劃從視圖中提取數據,除非我可以在該過程中使用臨時表。

Tbl1 
*Hostname* | *SerialNo* 
Laptop1  | ABC123 
Laptop2  | DEF987 
Desktop1 | WER987 
Desktop2 | YRT848 
Desktop3 | YTT876 
Laptop2  | HJK321 

Tbl2 
*Location* | *SerialNo* 
MS  | ABC123 
CO  | DEF987 
CA  | ZYC342 
AZ  | XYZ789 
IN  | HJK321 

我想什麼,結果看到...

Result1 
*Hostname* | *SerialNo* |*Location* |*RecordOrigin* 
Laptop1  | ABC123  |MS   |Tbl2 
Laptop2  | DEF987  |CO   |Tbl2 
Desktop1 | WER987  |NULL  |Tbl1 
Desktop2 | YRT848  |NULL  |Tbl1 
Desktop3 | YTT876  |NULL  |Tbl1 
Laptop2  | HJK321  |IN   |Tbl2 

我試圖創造RecordOrigin信息的附加表,但我沒能正確地加入到其他表。

我還應該注意到,我無法編輯源表表格中的數據或更改其結構(即Tbl1,Tbl2等)。

回答

0

可以使用case表達,看是否有表返回一個列或不喜歡這樣:

select 
    t.Hostname 
    , t.SerialNo 
    , l.Location 
    , RecordOrigin = case 
     when l.SerialNo is not null 
     then 'Tbl2' 
     else 'Tbl1' 
     end 
from Tbl1 as t 
    left join Tbl2 as l 
    on t.SerialNo = l.SerialNo 
0

我想我可能由UNION已經想通了的表和使用DISTINCT和MAX刪除複製。

SELECT DISTINCT Hostname, MAX(SerialNo), MAX(Location), RecordOrigin 
FROM 
(
SELECT Hostname, SerialNo, Location, 'Tbl1' AS RecordOrigin 
FROM Tbl1 

UNION 

SELECT Hostname, SerialNo, Location, 'Tbl2' AS RecordOrigin 
FROM Tbl1 
) 
GROUP BY Hostname, RecordOrigin