繁体   English   中英

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

[英]Inner join with multiple conditions across multiple tables (SQL)

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

我有以下三个表( Table :Columns):

  • VisitTable :pid,visit_date,visit_start_datetime,visit_end_datetime,visit_id,visit_type,visit_length,visit_rating

  • CondTable:PID,cond_date,cond_datetime,cond_id,cond_type,cond_length,cond_rating

  • ProdTable :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 )的结果Temp3

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

然后我想借此结果( Temp4 )中并用内加入它Temp3pid其中Temp3.prod_start_datetime是在范围[Temp1.visit_start_datetime, Temp1.visit_end_datetime]

问题:

  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查询中,我最初尝试将WHERE子句与visit_date一起使用,但收到一条错误消息,指出“ visit_date”是一个整数。 然后,我尝试使用visit_start_datetime ,它接受了条件>= '01/01/2009' 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM