Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择具有多个内部联接的“不同”_Sql_Sql Server - Fatal编程技术网

Sql 选择具有多个内部联接的“不同”

Sql 选择具有多个内部联接的“不同”,sql,sql-server,Sql,Sql Server,我正在尝试提取患者列表,需要排除所有重复的SubscriberNumber值。我可以在不使用Where(Primary_Insurance.SubscriberNumber=的情况下使用Select Distinct子句,它工作正常。当我将(Primary_Insurance.SubscriberNumber=添加到我的查询时,它会忽略我的日期范围,并提取与SubscriberNumber关联的所有约会 SELECT Primary_Insurance.SubscriberNumber,

我正在尝试提取患者列表,需要排除所有重复的SubscriberNumber值。我可以在不使用Where(Primary_Insurance.SubscriberNumber=的情况下使用Select Distinct子句,它工作正常。当我将(Primary_Insurance.SubscriberNumber=添加到我的查询时,它会忽略我的日期范围,并提取与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'))只是现在它不返回任何数据。