在SQL中加入帮助

时间:2019-01-07 15:32:08

标签: sql sql-server

我有2个非常简单的表要连接,但是我很想念某个地方,因为我没有得到想要的输出:

表#1:

enter image description here

表#2:

enter image description here

所需的输出:

enter image description here

查询:

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

我还是一个学习者,如果这里有任何错误,请原谅我。有帮助吗?!

5 个答案:

答案 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