Rolf B: SQL - Join und SubSelect

Beitrag lesen

Hallo Casablanca,

zum einen - bist Du sicher, dass Du für die Kombination von UserLanguages, Tasks und Languages einen LEFT JOIN brauchst? Sicherlich wird es keinen Task geben, der eine unbekannte LanguageId hat. Und es wird auch keinen UserLanguage Satz geben, der eine unbekannte LanguageId hat.

Insofern wirst Du wohl keine Ergebniszeilen bekommen, wo aus der Tasks- oder Language-Abfrage nichts herauskommt. Und es wäre fachlich auch nicht sinnvoll, glaube ich. Man sollte keinen LEFT JOIN formulieren, wo fachlich ein INNER JOIN angemessen ist.

Soweit dazu. Zu deinem Problem: Du könntest einen LEFT JOIN auf die UserTasks machen (hier ist ein LEFT JOIN korrekt, weil es ja auch keine Treffer geben kann) und dann STATUS IS NULL OR STATUS=1 prüfen. STATUS <> 0 könnte auch gehen, NULL ist ungleich zu allem. Musst Du ausprobieren.

SELECT ul.UserId, l.Language, t.TaskId
FROM UserLanguages ul
  Join Tasks t ON ...
  Join Languages l ON ...
  Left Join UserTasks ON ut.UserId=ul.UserId AND ut.TaskId=t.TaskId 
WHERE ul.UserId = VARIABLE  
-- verwende dies:
  AND (ut.status IS NULL OR ut.status = 1)
-- oder dies:
  AND (ut.status <> 0)

Ich habe die Filterbedingung

Es ist bei umfangereicheren Queries oft lesbarer, den Tabellen Aliasnamen zu geben, dann schreibt man nicht so viel und das Statement ist übersichtlicher. Das habe ich einfach mal gemacht.

Aber ich glaube, es ist einfacher (und vermutlich auch effizienter), wenn Du nicht nach den Sätzen fragst, die Du haben willst, sondern nach denen, die Du nicht haben willst: mit NOT EXISTS (...)

SELECT ul.UserId, l.Language, t.TaskId
FROM UserLanguages ul
  Join Tasks t ON ...
  Join Languages l ON ...
WHERE ul.UserId = VARIABLE  
  AND NOT EXISTS (SELECT * FROM UserTasks ut
                  WHERE ut.UserId=ul.UserId AND ut.TaskId=t.TaskId 
                    AND ut.Status=0)

Probier beides aus, mach Explains, miss die Performance. Verwende das, was besser läuft oder was Du besser verstehst 😉

Rolf

--
sumpsi - posui - obstruxi