Join Problem, feststellen, welche Datensätze mir noch fehlen

Ueberforderter

Benutzer
Beiträge
5
Hallo an die Profis,
wer kann mir helfen? Ich bin am verzweifeln, trotz google :-(
Ich möchte einen Teil einer Tabelle synchronisieren und feststellen, welche Datensätze mir noch fehlen.
Leider schaffe ich es nicht, nur die Datensätze anzuzeigen, die ich synchronisieren will.
1709615016246.png

Ich möchte nur die Datensätze anzeigen, wo die ProductionID auch in der rechten Tabelle vorkommt, also die beiden 'Erstklassik' 2 und 5.
Bzw. alle 6 DS mit 'Erstklassik' und Null in den Feldern der rechten Tabelle...
'Essen' soll nicht angezeigt werden, da die ProductionID 285 nicht in der rechten Tabelle vorkommt...


Select
tblProduktionen.Productionid,
tblProduktionen.ActivityID,
tblProduktionen.Title,
tblVorstellungen.Titel,
tblVorstellungen.id,
tblVorstellungen.ActivityID,
tblVorstellungen.ProductionID
From
tblProduktionen Inner Join
tblVorstellungen On tblProduktionen.ActivityID = tblVorstellungen.Activity_ID

Mein Ergebnis (IDs sind andere...)
1709615555123.png

Brauche ich einen Sub-Select, evtl. mit COUNT? Oder ein Having?

Ich hoffe ich hab's einigermaßen verständlich dargestellt :)

Danke für Eure Hilfe.
 

Anhänge

  • 1709614393595.png
    1709614393595.png
    14,9 KB · Aufrufe: 0
Werbung:
Das reine Vorkommen von DS in 2 verschiedenen Tabellen macht man nicht per Count, es ist zu aufwändig.
Du solltest Dich mit den verschiedenen Formen von JOIN vertraut machen.
INNER JOIN (wie Du ihn genutzt hast), OUTER JOIN, ..
Outer Joins zeigen auch unpassende Datensätze an.

Sollen die Production ID nur vorkommen oder übereinstimmen?
Wenn sie übereinstimmen müssen, dann muss es mit in den Join rein. Das ist der einfache Fall.

Die Daten und Selectstatements, die Du zeigst, passen nicht zusammen (ich wüsste nicht, wie es gehen sollte) und wenn Du Daten joinen möchtest, aber nicht mit dem Ergebnis zufrieden bist, zeige doch auch alle passenden / unpassenden Spalten.

Deine Bilder sehen so aus, als sei es einfach Excel.

In solchen Fällen macht man ein einfaches Beispiel für das Forum, 5 Inserts in der einen Tabelle 4 in der anderen oder so, zeigt das Ist- Ergebnis und das Wunschergebnis.
 
Sorry und Danke.
Hoffe so ist es besser:

tblProductions:
1709626178714.png
tblVorstellungen:
1709626222205.png

Mein Ergebnis mit:
Select [Titel], [ProducionID], [ActivityID], [IDV]
From
[dbo].[tblProductions] Left Join
tblVorstellungen On tblProductions.[ActivityID] = tblVorstellungen.[Activity_ID]
Where IDV Is Null

1709626403491.png
zeigt alles was in tblVorstellungen fehlt.
Ich möchte aber nur die DS bekommen, wo die ProductionsID in tblVorstellungen schon vorkommt.


Gewünschtes Ergebnis:
1709626592798.png
.. weil 'Essen' (285) nicht in tblVorstellungen vorkommt und nicht synchronisiert werden soll.

Besser?
Danke im Voraus.
 
Besser, aber ich verstehe Dein Problem nicht richtig.
Wenn Du einen Left Join mit isNull auf der rechten Tabelle machst, kommen natürlich nur die raus, die nicht vorhanden sind.
Also allein schon is null wegzulassen, wäre eine Verbesserung.

Und Du hast meine Frage nicht beantwortet: "vorkommt" oder übereinstimmt. Wenn es um Übereinstimmung geht, was ich naheliegender finde, als ein bloßes Vorkommen, dann das umbauen zu
Select [Titel], [ProducionID], [ActivityID], [IDV]
From
[dbo].[tblProductions] Left Join
tblVorstellungen On tblProductions.[ActivityID] = tblVorstellungen.[Activity_ID]
Where IDV Is Null
Code:
    select [Titel], [ProducionID], [ActivityID], [IDV]
      from [dbo].[tblProductions] Left Join tblVorstellungen 
        on tblProductions.[ActivityID] = tblVorstellungen.[Activity_ID]
       and tblProductions.ProductionID  = tblVorstellungen.ProductionID
Die Spalte die auch übereinstimmen soll, muss halt mit in den Join rein. Ohne eine Where Clause bekommst Du nun erstmal alles, passend oder nicht. Kannst Dir das Ergebnis anschauen und mit Where filtern oder sogar den left join zu einem inner join machen.

Aber vielleicht geht es doch um "vorkommen" statt übereinstimmen, das wäre was anderes.
 
Mmh, irgendwie reden wir aneinander vorbei.
Was kommt denn raus, wenn du wie vorgeschlagen mein Statement ausführst und das "Left" entfernst, also einen inner join machst?
Ist Essen dabei?
 
Mmh, irgendwie reden wir aneinander vorbei.
Das liegt an meiner Erklärung 🤪

Was kommt denn raus, wenn du wie vorgeschlagen mein Statement ausführst und das "Left" entfernst, also einen inner join machst?
Dann hab ich alle, die in tblVorstellungen vorhanden sind, ohne 'Essen':

1709641196327.png
Ich brauch aber die Vorstellungen aus der Linken Tabelle, die in Vorstellungen fehlen und die Produktion in Vorstellungen schon vorkommt...
Mit 'Essen' (285) gibts keinen Datensatz in tblVorstellungen, deswegen will ich den nicht haben.....

Wunsch:
1709641385682.png
Jetzt?
 
Ich glaub ich habs kapiert.
Wenn Du "Essen" dynamisch ausschließen willst, weil es in Vorstellungen fehlt, dann musst Du dort in Vorstellungen alle vorhandenen distinct sammeln anhand eines definierten Kriteriums (hab productionid genommen) und in Dein halbfertiges Statement joinen.

Code:
select *
      from tblProduktionen p left outer join tblVorstellungen v 
        on p.ActivityID = v.Activity_ID
      join (Select distinct ProductionID from tblVorstellungen) x
        on p.ProductionID  = x.ProductionID
where v.idv is null
 
Brauche ich einen Sub-Select, evtl. mit COUNT? Oder ein Having?
Hab schon vermutet, das ich sowas wie einen Sub-Select brauche, aber so wär ich nicht draufgekommen.
Wahrscheinlich brauchst Du kein Subselect, sicher kein count, kein having.
Die Daten die Du zeigst, sind ja offenbar nicht "original" direkt aus einer Tabelle, sondern bereits Ergebnis einer Abfrage oder eines Views.

Das Subselect
Code:
Select distinct ProductionID from tblVorstellungen
bzw. das Distinct und der Aufwand für die DB, diese Menge zusammenzufassen,
wäre überflüssig, wenn man die Originaltabelle in das Statement joinen würde.
 
Werbung:
P.S.
Wenn Du zukünftig Text statt Bildern postest und Abfragen, die durchgängig Table Aliase verwenden, besonders wenn ziemlich identische Spaltennamen / Datenmengen verwendet werden, dann flutscht es vielleicht besser mit den Antworten.
 
Zurück
Oben