Ist es möglich sich die Kontakte filtern zu lassen, die bspw. eine Aktivität mit dem Kommentar: „Veranstaltung 1“ und eine Aktivität mit dem Kommentar: „Einladung 1“ haben.
Muss hier ein freier SQL-Befehl erstellt werden? Oder kann die Software dies von Haus aus?
exists (
select A.„ID“ from „Activities“ as A
where C.„ID“ = A.„ContactID“
and A.„Comment“ = ‚Veranstaltung 1‘
)
and /or/ /and not/
exists (
select A.„ID“ from „Activities“ as A
where C.„ID“ = A.„ContactID“
and A.„Comment“ = ‚Veranstaltung 2‘
)
[/code]
relvant für dich ist in beiden Kriterien die Bedingung A.„Comment“ = ‚…‘ und dass beide Kriterien mit „and“ verknüpft sind. Hier könnte man den Operator auch auf „or“ oder „and not“ umändern, wenn man das mal braucht (z.B. „alle Kontakte, die eine Aktivität ‚Veranstaltung 1‘ besitzen, aber keine zu ‚Veranstaltung 2‘“).
Auf den Datentyp NTEXT können nicht alle Operationen angewandt werden, unteranderem kann man ihn nicht mit einer Zeichenkette vergleichen. Du kannst alternativ z.B. auf LIKE zurückgreifen oder du wandelst deine NTEXT Spalte „on the fly“ in NVARCHAR um. Generell kann das natürlich Performance kosten, eventuell solltet ihr für Coment Felder wenn möglich auch NVARCHAR einsetzen. TEXT und NTEXT sind nicht zu empfehlen und werden auch von Microsoft als problematisch angesehen.
Hier mal ein Vorschlag (ich arbeite in diesem Fall lieber mit Joins als mit EXISTS):
SELECT c.ID
FROM Contacts c
INNER JOIN Activities a1
ON c.ID = a1.ContactID
AND a1.Comment LIKE ‚%Veranstaltung 1%‘
– alternativ: cast(Comment AS NVARCHAR(4000)) = ‚Veranstaltung 1‘
INNER JOIN Activities a2
ON c.ID = a2.ContactID
AND a2.Comment LIKE ‚%Einladung 1%‘
– alternativ: cast(Comment AS NVARCHAR(4000)) = ‚Einladung 1‘
dein verkettetes JOIN impliziert immer ein „UND“ - das passt zwar zur genauen Ausgangsfrage, aber wenn die sich nur minimal ändert, behaupte ich, kann man deinen ansiatz gar nicht mehr verwenden.
Daher meine Fragen: wie realisierst du mit diesem JOIN-Konstrukt
1.) ein „ODER“, konkret „alle Kontakte mit einer Aktivität ‚Veranstaltung 1‘ oder einer Verkaufschance(!) ‚Veranstaltung 2‘“?
2.) ein „NICHT“, konkret „alle Kontakte mit einer Aktivität ‚Veranstaltung 1‘ aber nicht mit einer Aktivität ‚Veranstaltung 2‘“?
In meinem EXISTS Konstrukt muss man für jede der o.a. Beispiele jeweils immer nur den Operator zwischen den EXISTS Blöcken ändern und (ggf. wie bei 1.) noch in einem Block den Tabellennamen) -> das Grundgerüst funktioniert aber immer.
Ich mag daher lieber allgemeine Lösungen, die immer funktionieren bzw. sich ganz leicht anpassen lassen, vor allem wenn man kein Profi ist. Aber evtl. hab ich bei deinem Ansatz auch was übersehen! Ist eh alles Geschmackssache.
Ein ODER ließe sich noch leicht mit Join abbilden, in diesem Fall:
SELECT c.ID
FROM Contacts c
INNER JOIN Activities a1
ON c.ID = a1.ContactID
AND ( a1.Comment LIKE ‚%Veranstaltung 1%‘
OR a1.Comment LIKE ‚%Einladung 1%‘ )
Bei einem NAND müsste man tatsächlich auf NOT EXISTS zurück greifen, denn etwas das es nicht gibt kann ich nicht joinen.
Ich habe aber auch nichts gegen den Einsatz von EXISTS oder von „Abstraktion“ des Codes aber in manchen Fällen wirst du damit Probleme bekommen. In diesem Fall sicher nicht, zumal Combit ja auch nur die Datensatz ID haben will und keine Informationen aus mehreren beteiligten Tabellen ausgegeben werden soll.