我有2个非常简单的表要连接,但是我很想念某个地方,因为我没有得到想要的输出:
表#1:
表#2:
所需的输出:
查询:
create table #temp1
(
client_id int,
identifier int,
pp_id int,
ch_id int,
code varchar(20),
program varchar(20),
startdate date,
enddate date,
ssc varchar(50)
)
insert into #temp1
values (9908,789654123,1567,1566,'OP','xASMT','1/1/2019','1/4/2019','A201901044F010134NNN01D 151 143 093 ')
create table #temp2
(
client_id int,
identifier int,
pp_id int,
ch_id int,
code varchar(20),
program varchar(20),
startdate date,
enddate date,
ssc varchar(20)
)
insert into #temp2
values(9908,789654123,1574,1573,'OP','SU1','1/1/2019','1/4/2019',NULL)
--My query:
select
t1.client_id, t1.identifier,
concat(t1.code, t1.startdate, t1.enddate, t1.ssc),
concat(t2.code, t2.startdate, t2.enddate, t2.ssc)
from
#temp1 t1
left join
#temp2 t2 on t1.client_id = t2.client_id and t1.identifier = t2.identifier
我还是一个学习者,如果这里有任何错误,请原谅我。有帮助吗?!
答案 0 :(得分:6)
我不认为您需要加入,但您需要工会:
select t1.client_id, t1.identifier, CONCAT(t1.code,t1.startdate,t1.enddate,t1.ssc)
from #temp1 t1
union all
select t2.client_id, t2.identifier, CONCAT(t2.code,t2.startdate,t2.enddate,t2.ssc)
from #temp2 t2
也许您需要一个where
部分来限制某些行的结果。
参见demo
答案 1 :(得分:4)
这是您不想要做的,只是发布,因为您询问了JOIN。这绝对是错误的方法,但是:
select
COALESCE(t1.client_id, t2.client_id) client_id,
COALESCE(t1.identifier, t2.identifier) identifier,
COALESCE(
CONCAT(t1.code,t1.startdate,t1.enddate,t1.ssc),
concat(t2.code,t2.startdate,t2.enddate,t2.ssc)
)
from
#temp1 t1
full outer join
#temp2 t2
on 0 = 1
在不可能的情况下,这些表之间的完全外部联接意味着您最终得到的结果集如下:
t1.client_id t2.client_id
9908 NULL
NULL 9908
COALESCE将其分离性重新融合在一起:
client_id
9908
9908
如前所述,不这样做-与联合相比,这浪费了数据库的时间和资源。我纯粹是作为一个示例来说明如何使用JOIN实现结果集的垂直增长,并且还可以帮助您理解数据库理论和操作:
A UNION B (number is id)
Results grow vertically:
A1
A2
B1
B2
A JOIN B (number is id)
Results grow horizontally:
A1 B1
A2 B2
外部连接会保留表中的行,即使没有匹配项:
A OUTER JOIN B
Results:
A1 null
null B2
通过使联接成为不可能,完全的外部联接将导致结果集在水平和垂直方向上增长:
A OUTER JOIN B ON 1 = 0
Results:
A1 null
A2 null
null B1
null B2
COALESCE返回第一个非null参数,因此,如果我们将COALESCE(a_column,b_column)折叠成两列,其中一列为null,则将其折叠为一列:
acol bcol COALESCE(acol, bcol) result
----|-----|--------------------|--------
A1 null COALESCE(A1, null) -> A1
null B2 COALESCE(null, B1) -> B1
答案 2 :(得分:3)
您似乎想要的是UNION
select构造,而不是联接。
UNION从一个子查询返回行,并从另一个子查询追加行
以您的示例为例
select t1.client_id, t1.identifier, CONCAT(t1.code,t1.startdate,t1.enddate,t1.ssc
from #temp1 t1
where ... some condition ...
union all
select t2.client_id, t2.identifier, concat(t2.code,t2.startdate,t2.enddate,t2.ssc)
from #temp2 t2
where ... some condition ...
在此处查看文档:{{3}}
答案 3 :(得分:2)
关于所需的结果,我了解您需要使用UNION ALL而不是联接表。
请检查脚本:
SELECT
t1.client_id
,t1.identifier
,CONCAT(t1.code, t1.startdate, t1.enddate, t1.ssc)
--,CONCAT(t2.code, t2.startdate, t2.enddate, t2.ssc)
FROM #temp1 t1
UNION ALL
SELECT
t2.client_id
,T2.identifier
,CONCAT(t2.code, t2.startdate, t2.enddate, t2.ssc)
FROM #temp2 t2
答案 4 :(得分:2)
这是我用来获取输出的内容:
select
t1.client_id,
t1.identifier,
CONCAT(t1.code,t1.startdate,t1.enddate,t1.ssc) ssc_concatenated
--concat(t2.code,t2.startdate,t2.enddate,t2.ssc)
from #temp1 t1
union all
select
t2.client_id,
t2.identifier,
concat(t2.code,t2.startdate,t2.enddate,t2.ssc) ssc_concatenated
from #temp2 t2
这是db <>小提琴demo