2个表

时间:2017-04-27 10:20:54

标签: sql sql-server 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')

你能帮我解决吗? 非常感谢!

2 个答案:

答案 0 :(得分: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;

如有任何问题,请告诉我

答案 1 :(得分: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