2017-05-03 4 views
1

ich für Studenten mit
Abwesenheit reason_code = 'DOG_ATE_HOME_WORK'
Suche und das nicht Grund hat 'I_WAS_DRUNK' in der VergangenheitAbfrage existiert und nicht existiert

Angesichts der Tatsache, dass es Tausende von Studenten und Millionen von Gründen, in der db, ist dies der effizienteste Weg auf mssql gehen?

select student_id from students where 
     exists(
      SELECT 1 FROM absence_reasons absence_r 
      where absence_r.student_id = students.student_id and 
      absence_r.reason_code = 'DOG_ATE_HOME_WORK' 
      ) 
     and not 
     exists(
      SELECT 1 FROM absence_reasons absence_r 
      where absence_r.student_id = students.student_id 
      and absence_r.reason_code = 'I_WAS_DRUNK' 
      ) 
+3

Ich glaube, Sie müssen Ihre chagne „und nicht existiert“ zu '=‚I_WAS_DRUNK'' –

+1

Doing ein Textvergleich nicht die beste Leistung geben Ihnen geht. Haben diese Tabellen ID-Werte, die Sie vergleichen können? Und hoffentlich ein Index? –

+1

@JacobH Nun, er schaut von der student_id nach oben, so dass es wahrscheinlich zu einer ziemlich kleinen Liste danach gefiltert wird. Bereit zu wetten würde es immer noch gut funktionieren –

Antwort

2

Mit EXISTS und NOT EXISTS ist in der Regel eine der effizientesten Möglichkeiten, um so etwas zu tun. Sie müssen nur sicherstellen, dass Sie einen student_id-Index haben. Wenn Sie noch mehr von einer Verbesserung wünschen, können Sie den reason_code zu diesem Index hinzufügen.

Das einzige Problem ist, dass Sie Ihre falsch geschrieben haben.

Ihre NICHT VORHANDEN Abfrage benötigt and absence_r.reason_code = 'I_WAS_DRUNK' statt and absence_r.reason_code <> 'I_WAS_DRUNK'

1

Sorry, wenn es nicht diesen Idealfall tun work.But andere Abfrage zu testen. Testen Sie beide zusammen mit Abfrageausführungsplan und verstrichene Zeit. Löschen Sie auch den Cache aus dem Puffer. Verwenden Sie auch Parametervariable. Erschöpfende Testing.

select student_id from 
      (
      select student_id,reason_code from students where 
      not exists(
      SELECT student_id1 FROM absence_reasons absence_r 
      where absence_r.student_id = students.student_id 
      and absence_r.reason_code = 'I_WAS_DRUNK' 
      ) 
      )t4 
      where reason_code = 'DOG_ATE_HOME_WORK'