2017-03-06 146 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