跨多个表 (SQL) 的具有多个条件的内部联接

  • 本文关键字:条件 内部 SQL sql
  • 更新时间 :
  • 英文 :


寻找有关将多个SQL查询组合成一个多部分内部连接语句的建议。

我有以下三个表(:列(:

  • 访问表:pid、visit_date、visit_start_datetime、visit_end_datetime、visit_id、visit_type、visit_length、visit_rating

  • 电汇表:pid、cond_date、cond_datetime、cond_id、cond_type、cond_length、cond_rating

  • 产品表:pid、prod_id、prod_date、prod_start_datetime、prod_end_datetime、prod_rating、prod_price

我有以下原子SQL查询:

select pid, visit_date, visit_start_datetime, visit_end_datetime
from VisitTable
where visit_id = XYZ AND visit_start_datetime > '01/01/2009'
select pid, cond_date, cond_datetime
from CondTable
where cond_id in (ABC, DEF, GHI)
select pid, prod_date, prod_start_datetime, prod_end_datetime
from ProdTable
where prod_id in (123, 456, 789)

让我们调用第一个查询 (Temp1(、第二个查询 (Temp2( 和第三个查询 (Temp3( 的结果。

我想在pidwhere (Temp1.visit_start_datetime <= Temp2.cond_datetime <= Temp1.visit_end_datetime( 上将Temp1Temp2进行内部连接,即在该pid的范围内Temp2.cond_datetime在范围内[Temp1.visit_start_datetime, Temp1.visit_end_datetime]的情况下。我们将此连接的结果称为Temp4

然后我想把这个结果(Temp4(与Temp3Temp3.prod_start_datetime在范围内[Temp1.visit_start_datetime, Temp1.visit_end_datetime]pid内连接。

问题:

  1. 如何使用具有多个内部联接和条件的 1 个 SQL 查询来执行此操作?

我尝试了以下语法,但不正确:

select pid, visit_date, visit_start_datetime, visit_end_datetime
from VisitTable
where visit_id = XYZ AND visit_start_datetime > '01/01/2009'
left join
(select pid, cond_date, cond_datetime
from CondTable
where cond_id in (ABC, DEF, GHI)) Temp2 on Temp2.pid = VisitTable.pid
where Temp2.cond_datetime between VisitTable.visit_start_datetime and VisitTable.visit_end_datetime
left join
(select pid, prod_date, prod_start_datetime, prod_end_datetime
from ProdTable
where prod_id in (123, 456, 789)) Temp3 on Temp3.pid = VisitTable.pid
where Temp3.prod_start_datetime between VisitTable.visit_start_datetime and VisitTable.visit_end_datetime
  1. 在第一个原子SQL查询中,我最初尝试使用带有visit_dateWHERE子句,但收到错误消息,说"visit_date"是整数。然后我尝试使用visit_start_datetime,它接受了条件>= '01/01/2009'。为什么会发生这种情况,无论如何我可以使用visit_date吗?

  2. 构造此查询后,如何按日期分组并计算每个日期显示的条目数?

谢谢!

请尝试以下 SQL,您的日期格式未被 SQL 查询理解。

select Temp1.* from
(
select pid, visit_date, visit_start_datetime, visit_end_datetime
from VisitTable
where visit_id = XYZ AND visit_start_datetime > '2009-01-01'
) as Temp1 inner join
(
select pid, cond_date, cond_datetime
from CondTable
where cond_id in (ABC, DEF, GHI)
) as Temp2 on Temp1.pid = Temp2.pid
and Temp1.visit_start_datetime <= Temp2.cond_datetime and Temp2.cond_datetime <= Temp1.visit_end_datetime
inner join
(
select pid, prod_date, prod_start_datetime, prod_end_datetime
from ProdTable
where prod_id in (123, 456, 789)
) as Temp3 on Temp1.pid = Temp3.pid
and Temp1.visit_start_datetime <= Temp3.prod_start_datetime and Temp3.prod_start_datetime <= Temp1.visit_end_datetime

最新更新