Rolf B: Keine Ausgabe - komplizierte Abfrage

Beitrag lesen

Hallo Bernd,

mir fällt auf, dass deine umgebaute Query anders joined als die Originalquery.

alt: kalender_termine.kt_datum = kalender_personal.kp_code
neu: kalender_personal.kp_code = kalender_termine.kt_kalenderID

Das wird wohl der Hauptgrund dafür sein, dass Du auf einmal Treffer bekommst.

Generell solltest Du noch einen EXPLAIN auf deine neue Query machen und Dir merken. Und dann solltest Du

  • den LEFT JOIN mit kalender_personal nach vorn ziehen (weil Du darauf einen WHERE ansetzt)
  • das LEFT in diesem LEFT JOIN weglassen, weil Du kp_code != "" abfragst, was Sätze abweist, in denen kp_code NULL ist. Die Sätze, die Du durch einen LEFT JOIN zusätzlich bekommst, werden demnach vom WHERE gleich wieder weggefressen.

Also so:

SELECT 
  kt_kalenderID, kt_datum, kp_id, kp_code, kp_userID, k_code, k_jobNr, k_bezeichnung,
  per_anrede, per_name, per_vorname 

FROM kalender_termine
              
JOIN
  kalender_personal ON kalender_personal.kp_code = kalender_termine.kt_kalenderID

LEFT JOIN
  kalender ON kalender.k_code = kalender_termine.kt_kalenderID

LEFT JOIN
  personal ON personal.per_code = kalender_personal.kp_userID
               
WHERE
  kt_datum = '2019-05-26'

AND kp_userID != ""

ORDER by test ASC

Du kannst Dich dann auch noch fragen, ob die Beziehung kalender_termine -> kalender tatsächlich optional ist (sprich: ob es kt_kalenderIDs geben kann, zu denen Du keinen k_code findest). Die gleiche Frage wäre für die Beziehung kalender_personal -> personal zu stellen. Wenn die Namen deiner Tabellen gut gewählt sind, würde ich annehmen, dass diese Beziehungen obligatorisch sind. Und dann kann das LEFT da weg.

Nachdem Du unnötige LEFT entfernt hast, solltest Du nochmal einen EXPLAIN machen und gucken ob der gewählte Zugriff besser geworden ist.

Ach ja, natürlich sollten die Spalten kp_code, k_code und per_code in einem Index zu finden sein, damit die JOINs nicht zu Table- oder Index-Scans führen. Aber das weißt Du sicherlich schon.

Rolf

--
sumpsi - posui - clusi