Sql server 三个表之间的SQL联接问题,在不满足条件时返回结果

Sql server 三个表之间的SQL联接问题,在不满足条件时返回结果,sql-server,Sql Server,我正在尝试运行一个查询,该查询将查看人员表、约会表和提醒表 我只想返回至少有1次约会、没有未来约会以及系统中没有活动提醒的人 SELECT p.person_ID from people p WHERE exists ( select 1 from appointments e where e.person_id=p.person_id AND e.appt_kept_ind='Y' ) AND not exists ( select 1 from appointment

我正在尝试运行一个查询,该查询将查看人员表、约会表和提醒表

我只想返回至少有1次约会、没有未来约会以及系统中没有活动提醒的人

SELECT  p.person_ID
from people p   
WHERE exists (
select 1 from appointments e where e.person_id=p.person_id 
    AND e.appt_kept_ind='Y' )
AND not exists (
   select 1 from appointments s where s.person_id=p.person_id 
   AND CONVERT(DateTime, s.apptdate, 112) > CURRENT_TIMESTAMP))
AND not exists (
   select 1 from reminder re where re.person_id=p.person_id 
   AND  CONVERT(DateTime, re.return_date, 112) > CURRENT_TIMESTAMP )
编辑:在接受反馈后,我删除了左连接;我注意到其中一个问题是,有人可能有一个活动的提醒,但提醒可能在过去并且仍然是活动的,因此我更新了它,以检查他们的提醒日期是否仅在将来,并排除这些记录

编辑:对模式的请求

Person
   person_id UniqueIdentifier NOT NULL PK
   firstname nvarchar NOT NULL
   lastname nvarchar NOT NULL
   ....

Appointments
   appointment_ID uniqueidentifier NOT NULL PK  
   person_ID uniqueidentifier NOT NULL
   apptdate nvarchar NOT NULL
   apptKept nvarchar (N or Y)

Reminder
    reminder_id uniqueidentifier NOT NULL PK
    person_ID uniqueidentifier NOT NULL
    return_date nvarchar NOT NULL
    Active nvarchar (N or Y)

我有几个问题:返回多个人员结果,如果我需要的所有数据都在人员表中,我甚至需要连接吗?最后,它的速度相当慢。

有一种观点让人想到:

如果一个人有多个约会或多个提醒,由于左加入,您将获得额外的列;顺便说一句,我不认为有必要加入这里的提醒,因为你没有利用结果。 在两个左连接之后的where部分中使用相关子查询。理论上,每个子查询都针对该联接返回的每个可能重复的元组进行计算。根据数据,我假设不相关的子查询可能会更快。 尝试以下语法是正确的,因为没有模式我无法尝试。这种方法是通过准备一个表appaggr来一次性检查预约,该表为每个person\u id计算保留的最大值,如果存在任何元组,则该值必须为Y;如果不存在未来预约,则在同一次运行中计算最新预约,该预约必须在当前时间戳之前。加入说明:未离开将此表加入到人员表应返回所有已预约且未预约的人员。此外,检查提醒被转换为不相关的子查询;如果没有太多人使用活动提醒,则此功能应能更有效地工作:

选择p.firstname、p.lastname、p.person\u ID、, 来自人民党 加入选择a.person\u id,maxa.keep作为maxkeep,maxCONVERTDateTime,a.apptdate,112作为maxdate 从a 按a.person\u id分组
有了maxkeep='Y'和maxdate,我不知道a.keep是做什么的,但是左键连接两个表将使它从两个表返回匹配项,并且如果在同一个表中点击两个条目,将创建重复条目。因此,在您的情况下,如果一个用户有两个约会,那么由于该连接,它将给出重复的person行。看起来您正在基于这些子选择进行所有筛选,所以我猜可能不需要连接。左侧联接也比内部联接慢,因此这可能解释了您的一些性能问题。发布后,我对其进行了更多的研究,并得出了以下结论:我添加了方案,当我尝试使用您的查询时,它说MaxKeep未定义