05 · Datenbank-Abfragen mit SQL
join_typen.svg
Abbildung · Quellcode
Erzeugt von join_typen() in lib/diagrams.py, Zeile 145–187.
Python
Python-Code: in eine Datei mit Endung
.py schreiben und mit dem ▶-Knopf in VS Code ausführen – oder Zeile für Zeile in die Python-Konsole. Setzt die in Modul 02 eingerichtete Umgebung voraus.def join_typen() -> str: pats = [("Pat. 1", "Sepsis", "2.1"), ("Pat. 2", "Pneumonie", None), ("Pat. 3", "Herzinsuff.", "1.8"), ("Pat. 4", "Sepsis", "3.4"), ("Pat. 5", "COPD", None)] rw, rh, gap = 336, 40, 8 y0 = 70 def panel(x, kw, kwcolor, sub, mode): p = [txt(x, 40, kw, size=14, fill=kwcolor, w=700, mono=True), txt(x + (128 if mode == "inner" else 118), 40, sub, size=11.5, fill=T["mut"])] for i, (name, diag, lak) in enumerate(pats): y = y0 + i * (rh + gap) has = lak is not None if mode == "inner" and not has: p.append(rect(x, y, rw, rh, r=10, fill=T["deatht"])) p.append(txt(x + 16, y + 25, f"{name}", size=12.5, fill=T["death"], w=600, deco="line-through")) p.append(txt(x + 74, y + 25, f"· {diag}", size=12.5, fill=T["death"], deco="line-through", opacity=0.8)) p.append(txt(x + rw - 16, y + 25, "fällt weg", size=12, fill=T["death"], w=600, anchor="end")) elif mode == "left" and not has: p.append(rect(x, y, rw, rh, r=10, fill=T["warnt"])) p.append(txt(x + 16, y + 25, name, size=12.5, fill=T["ink"], w=600)) p.append(txt(x + 74, y + 25, f"· {diag}", size=12.5, fill=T["mut"])) p.append(txt(x + rw - 16, y + 25, "laktat = NULL", size=11.5, fill=T["warn"], w=700, anchor="end", mono=True)) else: p.append(rect(x, y, rw, rh, r=10, fill=T["card"], stroke=T["rule"])) p.append(txt(x + 16, y + 25, name, size=12.5, fill=T["ink"], w=600)) p.append(txt(x + 74, y + 25, f"· {diag}", size=12.5, fill=T["mut"])) p.append(txt(x + rw - 16, y + 25, f"laktat {lak}", size=12, fill=T["acc2"], w=600, anchor="end", mono=True)) fy = y0 + len(pats) * (rh + gap) + 16 p.append(line(x, fy, x + rw, fy, stroke=T["rule"])) return "".join(p), fy left, fy = panel(24, "INNER JOIN", T["death"], "nur mit Laborwert", "inner") right, _ = panel(400, "LEFT JOIN", T["acc"], "alle bleiben", "left") b = [left, right, line(380, 24, 380, fy - 6, stroke=T["rule"], dash="2 5"), txt(24, fy + 26, "3 von 5 Zeilen", size=13, fill=T["ink"], w=600), txt(24, fy + 45, "2 Patient:innen fehlen, unbemerkt.", size=11.5, fill=T["mut"]), txt(400, fy + 26, "5 von 5 Zeilen", size=13, fill=T["ink"], w=600), txt(400, fy + 45, "Fehlende Werte sichtbar als NULL.", size=11.5, fill=T["mut"])] return canvas(760, fy + 60, "".join(b), "INNER JOIN gegen LEFT JOIN: Der INNER JOIN behält nur die drei Patient:innen mit Laborwert " "(zwei fallen unbemerkt weg); der LEFT JOIN behält alle fünf, fehlende Werte erscheinen als NULL.")