Subquery MUSS GENAU x Werte enthalten

Mean

Grünschnabel
Hallo zusammen,

ich zerbreche mir gerade den Kopf, wie ich etwas für MySql UND Oracle umsetzen kann. Und zwar habe ich folgende Tabellen

TEMPLATE
- ID
- TYPE_ID
- NAME
- ...

TEMPLATE_TYPE
- ID
- UNIQUE_IDENTIFIER
- NAME
- ...

GROUPS
- ID
- GROUP_ID
- ...

Die Beziehungen sind Template <-> Template_Type 1:1, Template <-> Groups 1:n


Ich möchte nun alle Templates vom Typ 'A' (der Wert steht im UNIQUE_IDENTIFIER - ich kann nicht über die ID gehen, sondern muss zwangsweise über den IDENTIFIER gehen) die genau zwei Gruppen (13 und 14) als GROUP_ID haben.

Wenn ein Template vom Typ 'A' z.B. die Gruppen 13, 14 und 16 hat darf das nicht gefunden werden, genauso wenig wie wenn es die Gruppe 13 hat oder die Gruppen 15, 18.

Ungültig wäre auch 13, 13, 14.

Das Query, das ich bisher hinbekommen habe prüft lediglich, ob die Gruppen 13 und 14 dem Template zugeordnet sind, nicht aber, dass es daneben keine anderen geben darf und die Gruppen 13 und 14 nur einmal zugeordnet sein dürfen.

Hier mal das Query, das ich bisher habe:

Code:
SELECT 
  TEMPLATE.ID,
  TEMPLATE.NAME
FROM TEMPLATE
LEFT JOIN TEMPLATE_TYPE
ON (TEMPLATE.TYPE_ID=TEMPLATE_TYPE.ID)
LEFT JOIN GROUPS a
ON (TEMPLATE.ID          =a.TEMPLATE_ID)
LEFT JOIN GROUPS b
ON (TEMPLATE.ID          =b.TEMPLATE_ID)
WHERE TEMPLATE_TYPE.UNIQUE_IDENTIFIER = 'A'
AND (a.GROUP_ID      =13
AND b.GROUP_ID       =14)

Könntet ihr mir bitte dabei weiterhelfen? Je einfacher, umso besser, da ich das ganze noch in die Sprache eines OR-Mappers umwandeln muss.

Vielen Dank und viele Grüße,

Dirk
 
Umsetzen musst du es noch selber

Konzept: Nach allen den Guppen filtern und dann zählen ob genauso viele Gruppen gefunden wurde

SQL:
SELECT
    master_id
FROM
    quelle
WHERE
    -- Hier die Auswahl
    grp IN (13, 14)
GROUP BY
    master_id
HAVING
    -- Hier die Anzahl der Auswahl eintragen
    COUNT(*) = 2
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yaslaw,

vielen Dank! Das HAVING hat mir gefehlt. Das ist ein sehr guter Tipp.

Eine fertige Lösung habe ich noch nicht, aber ich werde daran feilen.

Vielen Dank und viele Grüße,

Dirk
 
Hallo,

ich habe es jetzt gelöst bekommen. mit deiner HAVING condition hat es leider nicht funktioniert, weil das Statement die Template-Id nicht kannte. Es hat dann aber mit einem count in einem Subselect in der Where clause funktioniert (wobei ich eigentlich sicher war, dass ich das schon probiert hatte und es nicht geklappt hat):

Code:
SELECT 
  TEMPLATE.ID,
  TEMPLATE.NAME
FROM TEMPLATE
LEFT JOIN TEMPLATE_TYPE
ON (TEMPLATE.TYPE_ID=TEMPLATE_TYPE.ID)
LEFT JOIN GROUPS a
ON (TEMPLATE.ID          =a.TEMPLATE_ID)
LEFT JOIN GROUPS b
ON (TEMPLATE.ID          =b.TEMPLATE_ID)
WHERE TEMPLATE_TYPE.UNIQUE_IDENTIFIER = 'A'
AND (a.GROUP_ID      =13
AND b.GROUP_ID       =14)
AND (SELECT
    COUNT(TEMPLATE.ID)
FROM
    TEMPLATE_TYPE
WHERE
    ID = TEMPLATE.ID
GROUP BY
    TEMPLATE.ID) = 2

Vielen Dank aber nochmal, da mir die Antwort generell mal den Weg gewiesen hat.

Viele Grüße,

Dirk
 
Zurück