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 JOIN 2 个表并分别获取两个表的总和

MySQL INNER JOIN 3 个表的计数和总数

来自第二个表的 MySQL INNER JOIN (TOP10)

LEFT JOIN,如果存在第二个表的结果,则添加到 PHP 中的数组

NNER JOIN连接两个表三个表五个表的SQL语句

一个奇怪的 Oracle SQL,它来自 3 个表,但在 where 子句中只留下了 join 2?