[sql] group by bzw. distinct | durchsuch. 3er tab

hi!

ich habe folgendes problem, dass der mssql server, im gegensatz zu mysql alle spalten in der group by clause braucht, die auch ausgegeben werden…
so, das war jetzt ein bisschen vorgegriffen…die tabellenstruktur schaut so aus:

tabelle artikel:
a_id
a_titel
a_beschreibung

zwischentabelle _stichw_art:
sa_a_id //referenz id auf a_id
sa_stichw_id //referenz id auf stw_id

tabelle stichworte:
stw_id
stw_name

die zwischentabelle brauch ich, da jeder artikel beliebig viele stichworte zugewiesen bekommen kann. so, so weit so gut, gescheitert bin ich schlussendlich an der suche. probiert hab ichs mit folgendem sql, statement:

select * from
artikel, _stichw_art, stichworte
where
_stichw_art.sa_a_id = artikel.a_id and _stichw_art.sa_stw_id=stichworte.stw_id and
stichworte.stw_name like „%h%“

h ist dabei der eingegebene suchbegriff…

so weit so gut, funktioniert ja auch eingeitch sehr gut, nur…
wie verhindere ich dass mir artikel doppelt ausgegeben werden ???
wenn 2 stichworte den buchstaben h enthalten kríeg ich das ergebnis gleich 2mal und in folge dann halt noch öfter…
okay, erster versuch distinct…fehlgeschlagen weil ich kein distinct auf so longtext-spalten machen darf (a_beschreibung), oder wie auch immer die heißen, nur text glaub ich, jedenfalls die mit mehr als 255 zeichen…
okay, nächste möglichkeit, group by a_id…fehlgeschlagen weil ich alle die ich ausgeben will in der group by klausel oder in einer aggregatfunktion haben muss, dass aber mit text-spalten beides nicht möglich ist…

hoffe mir kann irgendwer das sql-statement so umbaun, dass das funktioniert…muss ja wohl irgendwie gehen…
ansonsten irgendwelche workarounds…dass ich z.b. pro schleife eine query schick oder so…
naja, egal, vielleicht kann mir ja wer helfen…

danke,
georg

oha, das hätte eignetlich zu datenbanken gehört, sorry…
aber vielleicht weiß da ja trotzdem wer was…

Versuch’s mal so:

select * from
artikel
where artikel.a_id in
(select distinct artikel.a_id
from artikel, _stichw_art, stichworte
where
_stichw_art.sa_a_id = artikel.a_id and
_stichw_art.sa_stw_id=stichworte.stw_id and
stichworte.stw_name like „%h%“
)

Elmar

hi, super idee…ich hab mir eh gedacht, dass man das vielleicht mit irgendeinem subselect lösen könnte, aber nachdem ich erst seit einer woche sql kann bin ich noch ziemlich unbeholfen…
kann das jetzt nicht ausprobieren, weil ich nicht bei der arbeit bin…aber wird nehm ihc an funktionieren…
danke nochmal,
georg

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Versuch’s mal so:

Verzeihung, aber rennst da nicht irgendwie mit der Kirche ums Kreuz? Die Abfrage hat den gleichen Effekt wie das Subselect, wenn du im Subselect das stichworte wegläßt, schließlich mußt du Spalten die du in die WHERE-Klausel einbaust nicht im SELECT drinnen haben.

Folgendes müßte das gleiche bewirken (und ist performanter/kürzer):

SELECT DISTINCT artikel.a\_id FROM artikel, \_stichw\_art, stichworte
 WHERE \_stichw\_art.sa\_a\_id = artikel.a\_id AND
 \_stichw\_art.sa\_stw\_id = stichworte.stw\_id AND
 stichworte.stw\_name LIKE '%h%'

oder
SELECT artikel.a\_id FROM artikel, \_stichw\_art, stichworte
 WHERE \_stichw\_art.sa\_a\_id = artikel.a\_id AND
 \_stichw\_art.sa\_stw\_id = stichworte.stw\_id AND
 stichworte.stw\_name LIKE '%h%'
 GROUP BY artikel.a\_id

Grüße, Robert

So bekommt er aber nur A_ID geliefert und nicht die Spalten (A_TITEL und A_BESCHREIBUNG), die ihn eigentlich interessieren!

Elmar

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

So bekommt er aber nur A_ID geliefert und nicht die Spalten
(A_TITEL und A_BESCHREIBUNG), die ihn eigentlich
interessieren!

Naja, die kann er ohne weiteres mit in den SELECT nehmen.

Das einzige was problematisch sind, sind die Stichwörter die in der andren Tabelle liegen, aber die kriegt man über deine Abfragen auch nicht (weils schlicht ein logisches Problem ist bzw. AFAIK es keine Aggregatfunktion für die Gruppierung gibt die das vernünftig löst).

Grüße, Robert

So bekommt er aber nur A_ID geliefert und nicht die Spalten
(A_TITEL und A_BESCHREIBUNG), die ihn eigentlich
interessieren!

Naja, die kann er ohne weiteres mit in den SELECT nehmen.

Naja, er hatte ja geschrieben, dass für A_BESCHREIBUNG im SELECT kein DISTINCT mehr zulässig ist (wegen des Spaltentyps). Wie das mit dem Gruppieren ist, weiß ich nicht.

Elmar

Naja, er hatte ja geschrieben, dass für A_BESCHREIBUNG im
SELECT kein DISTINCT mehr zulässig ist (wegen des
Spaltentyps). Wie das mit dem Gruppieren ist, weiß ich nicht.

Aso, verstehe was du meinst. :smile:

Ansich sollte es mit GROUP schon gehen, aber wenn sowohl GROUP als auch DISTINCT sich weigern gehts natürlich schon mit dem Subselect.

Grüße, Robert

okay, danke für euren support…gelöst hab ich das jetzt mit meinem vater, der is schon ziemlich lang auf der sql-schiene unterwegs, und nachdem das wie gesagt eine suche ist, braucht a_beschreibung spalte auch net länger als 255 zeichen sein, also hat er einfach convert(string(255),a_beschreibung) oder so ähnlich halt geschrieben und danach is natürlich auch der distinct gegangen…
aber super, das mit dem subselect und so werd ich mir merken, vielleicht funktionierts ja doch irgendwie und ich kann man darauf zurückgreifen…
herzlichen dank…
georg