2017-04-27 61 views
1

我有一个问题,加入2个表。这可能与交易“全连接”或“交叉连接”,但我不能让它...JOIN问题2表

下面是一个简单的例子: - 2014:在客户端的“客户端1”来公司 - 2015年:他的client_id正在改变(改变出现在#client表中) - 2016:他得到一辆奥迪轿车(变化出现在#car表中) - 2017:他用宝马替换了他的奥迪(变更出现在#car表中)

我要的是一个查询这给了我4行所有的变化和正确的日期,像这样的画面:

enter image description here

以防万一,这里是SQL代码示例:

drop table #client 
drop table #car 

create table #client 
(
     client_name varchar(64), 
     client_id varchar(64), 
     date_validity_start date, 
     date_validity_end date 
) 

create table #car 
(
     client_name varchar(64), 
     car_brand varchar(64), 
     date_validity_start date, 
     date_validity_end date 
) 

insert into #client values('Client 1', 'A', '20140101', '20141231') 
insert into #client values('Client 1', 'B', '20150101', '20991231') 

insert into #car values('Client 1', 'Audi', '20160101', '20161231') 
insert into #car values('Client 1', 'BMW', '20170101', '20991231') 

你能pleasy帮助我吗? 非常感谢!

+0

情况下为什么date_validity_end 2015年12月31日在输出第2行?不应该是2099-12-31吗? – Jerrad

回答

0


您可以使用下面的查询

SELECT client_name, 
     client_id, 
     NULL AS car_brand, 
     date_validity_start, 
     date_validity_end 
FROM client 
UNION ALL 
SELECT client_name, 
     'B' AS client_id, 
     car_brand, 
     date_validity_start, 
     date_validity_end 
FROM car; 

让我知道的任何问题

0
select client.client_name, 
     client.client_id, 
     null, 
     client.date_validity_start, 
     client.date_validity_end 
from #client client 
union 
select car.client_name, 
     client.client_id, 
     car.car_brand, 
     car.date_validity_start, 
     car.date_validity_end 
from #client client 
join #car car on client.client_name = car.client_name and 
       client.date_validity_start < = car.date_validity_start and 
       client.date_validity_end >= car.date_validity_end