跨多个表使用多个条件的内部联接(SQL)

跨多个表使用多个条件的内部联接(SQL),sql,Sql,正在寻找有关将多个SQL查询组合到多部分内部联接语句的建议 我有以下三个表:表列: 可访问性:pid、访问日期、访问开始日期时间、访问结束日期时间、访问id、访问类型、访问长度、访问等级 条件表:pid、条件日期、条件日期时间、条件id、条件类型、条件长度、条件等级 产品表:pid、产品id、产品日期、产品开始日期时间、产品结束日期时间、产品评级、产品价格 我有以下原子SQL查询: select pid, visit_date, visit_start_datetime, visit_end_d

正在寻找有关将多个SQL查询组合到多部分内部联接语句的建议

我有以下三个表:表列:

可访问性:pid、访问日期、访问开始日期时间、访问结束日期时间、访问id、访问类型、访问长度、访问等级

条件表:pid、条件日期、条件日期时间、条件id、条件类型、条件长度、条件等级

产品表:pid、产品id、产品日期、产品开始日期时间、产品结束日期时间、产品评级、产品价格

我有以下原子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的结果


我想将Temp1与pid上的Temp2进行内部连接,其中Temp1.visit_start_datetime请尝试以下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

请尝试以下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

谢谢你@Vlam!“访问开始日期时间”栏实际上使用了您对“2009-01-01”和“01/01/2009”的建议。但是,尝试使用visit_date而不是visit_start_datetime将不起作用。使用您构建的查询,我将如何按日期分组并计算每个日期出现的条目数?当您说它不起作用时,您是说它没有返回任何值或错误的值吗?就诊日期是否使用与就诊开始日期时间相同的数据类型?您在这两个列中使用的数据类型是什么?实际上只是返回一个错误,说明visit_date是一个int。是的,这两个列的数据类型都不同。visit_start_datetime是datetime,而visit_date是int。不能将int与datetime进行比较。如果您可以将访问日期转换为日期时间,那么查询应该可以正常工作。是的,可以这样做!谢谢有关于分组和按日期计数的建议吗?谢谢@Vlam!“访问开始日期时间”栏实际上使用了您对“2009-01-01”和“01/01/2009”的建议。但是,尝试使用visit_date而不是visit_start_datetime将不起作用。使用您构建的查询,我将如何按日期分组并计算每个日期出现的条目数?当您说它不起作用时,您是说它没有返回任何值或错误的值吗?就诊日期是否使用与就诊开始日期时间相同的数据类型?您在这两个列中使用的数据类型是什么?实际上只是返回一个错误,说明visit_date是一个int。是的,这两个列的数据类型都不同。visit_start_datetime是datetime,而visit_date是int。不能将int与datetime进行比较。如果您可以将访问日期转换为日期时间,那么查询应该可以正常工作。是的,可以这样做!谢谢关于分组和按日期计数的任何建议?编辑为添加问题3-按日期分组和计数。提前感谢您的帮助。已编辑以添加问题3-按日期和计数分组。提前感谢你的帮助。