Sql 选择具有多个内部联接的“不同”
我正在尝试提取患者列表,需要排除所有重复的SubscriberNumber值。我可以在不使用Where(Primary_Insurance.SubscriberNumber=的情况下使用Select Distinct子句,它工作正常。当我将(Primary_Insurance.SubscriberNumber=添加到我的查询时,它会忽略我的日期范围,并提取与SubscriberNumber关联的所有约会Sql 选择具有多个内部联接的“不同”,sql,sql-server,Sql,Sql Server,我正在尝试提取患者列表,需要排除所有重复的SubscriberNumber值。我可以在不使用Where(Primary_Insurance.SubscriberNumber=的情况下使用Select Distinct子句,它工作正常。当我将(Primary_Insurance.SubscriberNumber=添加到我的查询时,它会忽略我的日期范围,并提取与SubscriberNumber关联的所有约会 SELECT Primary_Insurance.SubscriberNumber,
SELECT Primary_Insurance.SubscriberNumber, Encounter.DTTM, Patient_Iorg.OrganizationMrn AS MRN, Patient_Contact.HomePhoneArea, Patient_Contact.HomePhoneExchange, Patient_Contact.HomePhoneLast4,
Patient_Contact.LastName, Patient_Contact.FirstName, Patient_Contact.AddressLine1, Patient_Contact.AddressLine2, Patient_Contact.City, Patient_Contact.State, Patient_Contact.Zip,
Appointment.AppointmentStatusDE
FROM Appointment INNER JOIN
Encounter ON Appointment.PatientID = Encounter.PatientID INNER JOIN
Patient_Iorg INNER JOIN
Patient_Contact ON Patient_Iorg.PersonID = Patient_Contact.PatientID INNER JOIN
Primary_Insurance ON Patient_Iorg.PersonID = Primary_Insurance.patientid ON Encounter.PatientID = Primary_Insurance.patientid
WHERE (Encounter.DTTM > CONVERT(DATETIME, '2018-06-15 00:00:00', 102)) AND (Encounter.DTTM >= CONVERT(DATETIME, '2018-12-31 00:00:00', 102)) AND (Appointment.AppointmentStatusDE = 4) AND
(Primary_Insurance.SubscriberNumber = '19803782') OR
(Primary_Insurance.SubscriberNumber = '19835428') OR
(Primary_Insurance.SubscriberNumber = '19914818') OR
(Primary_Insurance.SubscriberNumber = '19993082') OR
(Primary_Insurance.SubscriberNumber = '19993082') OR
(Primary_Insurance.SubscriberNumber = '19993082')
group BY Primary_Insurance.SubscriberNumber, Encounter.DTTM, Patient_Iorg.OrganizationMrn, Patient_Contact.HomePhoneArea, Patient_Contact.HomePhoneExchange, Patient_Contact.HomePhoneLast4,
Patient_Contact.LastName, Patient_Contact.FirstName, Patient_Contact.AddressLine1, Patient_Contact.AddressLine2, Patient_Contact.City, Patient_Contact.State, Patient_Contact.Zip,
Appointment.AppointmentStatusDE;
需要弄清楚如何将Distinct与多个Where子句和内部联接一起使用想必,您想要的逻辑是:
WHERE Encounter.DTTM > '2018-06-15' AND
Encounter.DTTM >= '2018-12-31' AND
Appointment.AppointmentStatusDE = 4 AND
Primary_Insurance.SubscriberNumber IN ('19803782', '19835428', '19914818', '19993082', '19993082', '19993082')
您的查询有问题,因为或
条件周围没有括号。但是,与使用括号相比,中的更简单、更清晰
请注意,我更改了日期常量。SQL Server在将值转换为日期方面做得非常好。我发现这更具可读性。您想要的逻辑大概是:
WHERE Encounter.DTTM > '2018-06-15' AND
Encounter.DTTM >= '2018-12-31' AND
Appointment.AppointmentStatusDE = 4 AND
Primary_Insurance.SubscriberNumber IN ('19803782', '19835428', '19914818', '19993082', '19993082', '19993082')
您的查询有问题,因为或
条件周围没有括号。但是,与使用括号相比,
中的更简单、更清晰
请注意,我更改了日期常量。SQL Server在将值转换为日期方面做得非常好。我发现这更具可读性。什么是数据库/版本?什么是数据库/版本?您只需要一个Conference.DTTM>子句,Conference.DTTM>“2018-06-15”和
在这种情况下是多余的。@PhilBaines…这真是一个错误说得好。我把那个逻辑留在了里面,因为它是OP的逻辑。而且,因为大多数WHERE过滤器都在你的前导(最里面)之外表中,我将尝试尽可能多地移动到您的联接。您可以像将筛选器应用到WHERE子句一样对联接应用筛选器。这将提供巨大的性能提高,尤其是在表相当大的情况下。您将能够看到执行计划中的差异。这是我的新WHERE语句:WHERE(conference.DTTM>CONVERT(DATETIME,'2018-06-15',102))和(conference.DTTM>=CONVERT(DATETIME,'2018-12-31',102))和(Appointment.AppointmentStatusDE=4)和(Primary_Insurance.SubscriberNumber IN('19803782','19835428','19914818','19993082','19993082','19993082'))只是现在它不返回任何数据。您只需要one EXCEUTE.DTTM>子句,EXCEUTE.DTTM>“2018-06-15”和
在本例中是多余的。@PhilBaines…这是一个非常好的观点。我将该逻辑保留在中,因为它是OP的逻辑。另外,因为大多数WHERE过滤器都在前导(最内部)之外表中,我将尝试尽可能多地移动到您的联接。您可以像将筛选器应用到WHERE子句一样对联接应用筛选器。这将提供巨大的性能提高,尤其是在表相当大的情况下。您将能够看到执行计划中的差异。这是我的新WHERE语句:WHERE(conference.DTTM>CONVERT(DATETIME,'2018-06-15',102))和(conference.DTTM>=CONVERT(DATETIME,'2018-12-31',102))和(Appointment.AppointmentStatusDE=4)和(Primary_Insurance.SubscriberNumber IN('19803782','19835428','19914818','19993082','19993082','19993082'))只是现在它不返回任何数据。