我有来自两个不同数据库的两个表(相同结构),如果可能的话,我想使用单个查询进行整合。
我试图检索所有不同的序列号及其项目名称和两个类别标识符。序列号存储在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 :(得分: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
答案 1 :(得分:0)
Joel打败了我的同样的答案,虽然这实际上会有所不同。只需将@t1
和@t2
替换为您的表名。 FULL JOIN
返回两个表中的所有记录,如果没有匹配,则返回一侧的NULL
和另一侧的不匹配值:
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
);