3 Tabellen Joinen 1:N:N

Termos

Mitglied
Hallo Community,

folgendes Problem.

Ich habe 3 Tabellen.
Bsp:

Personal
_______________________________________________________
Personal Dienstplan
Mitarbeiter1 1
Mitarbeiter2 2
Mitarbeiter3 3


PersZeit
_______________________________________________________
Personal Orgstart
Mitarbeiter1 2013-01-01 00:00:00.000
2013-04-11 12:02:00.000
Mitarbeiter2 2013-01-01 00:00:00.000

Mitarbeiter3 ......


wochenplan
_________________________________________________________
Dienstplan Samstag KW von bis
1 FSa 42
2 - 42
3 SSa 42




Das Problem ist folgendes:

Ich muss die 3 Tabellen so joinen das raus kommt

Welcher Mitarbeiter (Personal) am Samstag (Wochenplan) einen bestimmten Dienstplan hatte (FSa SSa U Ksa) und dazu ob eine Zeit (PersZeit) in der Spalte orgstart hinterlegt ist.

Ich sehe hier das problem, das es für mich nciht möglich ist mit von und bis (Anfang KW und Endd KW) einen vergleich zu machen, sprich

wenn Mitarbeiter 1 Samstag das Modell SSa hatte, vergleiche Datum(PersZeit) mit (von+5).


Dazu habe ich versucht eine Unterabfrage zu machen um mit (von+5) rechnen zu können, dass hat aber nciht funktioniert.

Hier mein aktueller Code:

Code:
SELECT p.PERSONAL, w.KW , w.SATM, pz.ORGSTART
FROM PERSONAL p, WOCHENPLAN w, PERSZEIT pz
WHERE ((p.DIENSTPLAN = w.DIENSTPLAN) AND p.AKTIV = '1') AND w.VON > '2013-01-01' AND w.SATM IN ('Url', 'KSa' , 'FSa', 'SSa') AND p.PERSONAL IN (select PERSONAL from PERSZEIT)


dabei habe ich die Unterabfrage wieder raus geschmissen weil es nicht klappte...

Habt ihr ne Idee?

Vielen Dank
 
Ich versteh nicht was du mit dem +5 machen willst. Du willst ja nur den Samstag vergleichen und nicht eine ganze Periode, oder?

Oder muss ein Eintrag ind er Woche mit dem folgenden Stamstag verglichen werden?

Nachtrag:
Um zu verstehen was du schon hast: dein Code formatiert und lesbar
SQL:
SELECT 
    p.personal, 
    w.kw, 
    w.satm, 
    pz.orgstart 
FROM 
    personal p, 
    wochenplan w, 
    perszeit pz 
WHERE 
    (
        (p.dienstplan = w.dienstplan) 
        AND p.aktiv = '1'
    ) 
    AND w.von > '2013-01-01' 
    AND w.satm IN ('Url', 'KSa', 'FSa', 'SSa') 
    AND p.personal IN (
        SELECT 
            personal 
        FROM 
            perszeit
    )

Nachtrag 2:
Hier ansonsten ein Beispiel um das Datum des nächsten Samstags zu ermitteln.
Anstelle von NOW() kann auch ein beliebiges Datumsfeld einer Tabelle stehen
SQL:
STR_TO_DATE(DATE_FORMAT(NOW(), '%v.6.%x'),'%v.%w.%x') AS nextSaturday
 
Zuletzt bearbeitet von einem Moderator:
Ich habe versucht mit "von" aus der Tabelle wochenplan zu arbeiten.
Im Von steht der Anfang der Kalenderwoche (04.11.2013), das + 5 ergibt Samstag (9.11.2013) ... Damit habe ich versucht in Perszeit einen Vergleich durchzuführen. (DATUM in Wochenplan = Datum in PersZeit)

Problem, er hat das Datum zwar addiert also statt Montag 4.11.2013 kam 09.11.2013 - das aber über die komplette Spalte ... Also nicht für jeden Datensatz einzeln


Was ich brauch ist der Samstag für jede Kalenderwoche (muss wohl berechnet werden), in der ein Mitarbeiter eines der Passenden Tagesmodelle hat.


also
Personal TagesmodellSamstag Orgstart
M1 SSa xxxxxx <- Das bekomme ich nicht hin ...

Sobald ich die Tabelle perszeit mit joine bekomme ich millionen Datensätze ... scheinbar joine ich hier jeden Datensatz Personal mit xxx Personalzeiten
 
Zuletzt bearbeitet:
Mein 2te Nachtrag hast du wahrscheinlich nicht mehr gesehen.
Samstagsberechnung:
SQL:
STR_TO_DATE(DATE_FORMAT(NOW(), '%v.6.%x'),'%v.%w.%x') AS nextSaturday

Das andere Problem: Deine Verknüpfung wird nicht eindeutig sein.
 
Zuletzt bearbeitet von einem Moderator:
SQL:
SELECT 
    p.personal, 
    w.kw, 
    w.satm, 
    pz.orgstart,
    nextsaturday
FROM 
    personal p, 
    WOPLAN w, 
    perszeit pz, 
    (SELECT VON, convert(varchar, convert(datetime, VON), 111) as nextsaturday 
	FROM WOPLAN)foo
WHERE 
    (
        (p.dienstplan = w.dienstplan) 
        AND p.aktiv = '1'
    ) 
    AND w.von > '2013-01-01' 
    AND w.satm IN ('Url', 'KSa', 'FSa', 'SSa') 
    AND p.personal IN (
        SELECT 
            personal 
        FROM 
            perszeit
    )


Benutze SQL 2008, habe daher versucht es nachzubauen, das addieren von +6 fällt mir schwer ... mit 2 unterabfragen und dem parsen auf INT klappt es nicht ;/


Wenn ich es so ausführe um zu testen ob wenigstens das Datum umgewandelt wird, werden aus 10000 Datensätzen unendlich viele...
 
(Sorry, dachte bin im Bearbeiten)


Nachtrag:

Das unendlich Datensätze raus kamen lag am JOIN mit perszeit,

die funktionierende Abfrage:

SQL:
SELECT 
    p.personal, 
    w.kw, 
    w.satm
FROM 
    personal p, 
    WOPLAN w
WHERE 
    (
        (p.dienstplan = w.dienstplan) 
        AND p.aktiv = '1'
    ) 
    AND w.von > '2013-01-01' 
    AND w.satm IN ('Url', 'KSa', 'FSa', 'SSa')


gibt mir folgende Tabelle:


personal kw satm
Mitarbeiter1 4 FSa
Mitarbeiter1 5 FSa
Mitarbeiter1 6 FSa
Mitarbeiter2 2 FSa
Mitarbeiter2 5 FSa
Mitarbeiter2 8 URL
Mitarbeiter2 11 FSa
Mitarbeiter2 14 KSa




Wenn ich jetzt Personal.Personal mit perszeit.personal joine

Kommt nur noch Mitarbeiter1 mit allen Daten raus ... ich denke er verknüüpft hier einfach alles, was nicht erwünscht ist ... Er soll nur die Datensätze verknüpfen bei denen Personal.Personal = perszeit.Personal UND (Datum Samstag IN perszeit)

Nacxtrag2
SQL:
SELECT 
    p.personal, 
    w.kw, 
    w.satm,
    w.VON+6
FROM 
    personal p, 
    WOPLAN w
WHERE 
    (
        (p.dienstplan = w.dienstplan) 
        AND p.aktiv = '1'
    ) 
    AND w.von > '2013-01-01' 
    AND w.satm IN ('Url', 'KSa', 'FSa', 'SSa')


So komm ich auf die Richtigen Tage aber der Join klappt nicht ;/
 
Zuletzt bearbeitet:
Oh MS SQL 2008
Da kenn ich mich nicht aus.
Aber mit Googeln nach "ms sql next saturday" findest du viele Möglichkeiten
 
Das Problem den Samstag raus zu bekommen hab ich schon gelöst.

Ich kann nur die Tabellen nicht joinen so das ein sinnvolles Ergebniss kommt ...

Er scheint in perszeit alles zu multiplizieren ;(
 
Zurück