2 个表的 JOIN 问题
Posted
技术标签:
【中文标题】2 个表的 JOIN 问题【英文标题】:JOIN issue on 2 tables 【发布时间】:2017-04-27 10:20:54 【问题描述】:我在连接 2 个表时遇到问题。它可能处理“完全连接”或“交叉连接”,但我做不到......
这是一个简单的例子: - 2014 : 客户“客户 1”来到公司 - 2015 : 他的 client_id 正在改变(变化出现在#client 表中) - 2016 年:他买了一辆奥迪汽车(变化出现在#car 表中) - 2017 年:他用宝马取代了他的奥迪(变化出现在#car 表中)
我想要的是一个查询,它给了我 4 行的所有更改和正确的日期,如下图所示:
以防万一,这里是 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 行的 date_validity_end 2015-12-31?不应该是 2099-12-31 吗? 【参考方案1】:您可以使用以下查询
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;
如果有任何问题,请告诉我
【讨论】:
【参考方案2】: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
【讨论】:
以上是关于2 个表的 JOIN 问题的主要内容,如果未能解决你的问题,请参考以下文章
来自第二个表的 MySQL INNER JOIN (TOP10)