Alternative zu concat()

Alternative zu concat()

am 22.10.2007 16:47:01 von Erhard Rainer

Hallo,

wahrscheinlich ist die Frage schon mal hier beantwortet worde, aber ich
bin scheinbar nicht fähig eine entsprechende Antwort zu finden.

Ausgangslage:
Ich habe eine Tabelle, die folgende Daten beinhaltet:

ID | Bezeichnung | Sprache | Version
---+-------------+----------+--------
1 | Bez1 | Sprache1 | 0.1
2 | Bez1 | Sprache1 | 0.5
3 | Bez2 | Sprache1 | 0.1
4 | Bez1 | Sprache2 | 0.1

Das Ergebniss sollte also sein: (Die Reihenfolge ist mir eigentlich egal)

ID | Bezeichnung | Sprache | Version
---+-------------+----------+--------
2 | Bez1 | Sprache1 | 0.5
3 | Bez2 | Sprache1 | 0.1
4 | Bez1 | Sprache2 | 0.1

mAW.: Ich suche eine Loesung, die mir die _nur_ die jeweilig hoechsten
Versionen einer Bezeichnung, Sprache - Kombination ausgibt.

Mein erster Ansatz ging in die Richtung:
> Select
> Count(script.Bezeichnung) As anzahl,
> script.ID,
> script.Bezeichnung,
> script.Sprache,
> script.Version
> From
> script
> Group By
> script.Bezeichnung
Dann bliebe die Spalte Sprache unberuecksichtigt.

Um also auch die Sprache in die Abfrage miteinzubeziehen, habe ich die
Abfrage folgendermaßen erweitert:
> Select
> Count(CONCAT_WS("|",script.Bezeichnung, script.Sprache)) As anzahl,
> script.ID,
> script.Bezeichnung,
> script.Sprache,
> script.Version,
> From
> script
> Group By
> CONCAT_WS("|",script.Bezeichnung, script.Sprache)
Das fuehrt zwar zum richtigen Ergebnis, ist aber in meinen Augen alles
andere als eine schoene Loesung.

Hat jemand eine Idee, wie man die Abfrage hinsichtlich der Performance
optimieren könnte.

Danke im voraus.

Re: Alternative zu concat()

am 22.10.2007 17:08:16 von Claus Reibenstein

Erhard Rainer schrieb:

> Mein erster Ansatz ging in die Richtung:
>> Select
>> [...]
>> script.Version,

Versuch's hier mal mit MAX(Version). Und lass mal dieses "script." weg.
Das brauchst Du nicht, wenn Du nur eine Tabelle hast.

>> Group By
>> script.Bezeichnung

GROUP BY Bezeichnung, Version

> Um also auch die Sprache in die Abfrage miteinzubeziehen, habe ich die
> Abfrage folgendermaßen erweitert:
>> Select
>> Count(CONCAT_WS("|",script.Bezeichnung, script.Sprache)) As anzahl,
>> [...]
>> Group By
>> CONCAT_WS("|",script.Bezeichnung, script.Sprache)

Aua!

Gruß. Claus

Re: Alternative zu concat()

am 22.10.2007 17:36:53 von Erhard Rainer

Claus Reibenstein <4spammersonly@web.de> wrote:

> Versuch's hier mal mit MAX(Version).
>
>>> Group By
>>> script.Bezeichnung
>
> GROUP BY Bezeichnung, Version

Also so funktioniert es jetzt, Danke
> SELECT ID, Bezeichnung, Sprache, Max( Version )
> FROM script
> GROUP BY Bezeichnung, Sprache

> Und lass mal dieses "script." weg.
> Das brauchst Du nicht, wenn Du nur eine Tabelle hast.
In der Ralitaet sind es natuerlich weitaus mehr Tabellen, aber das ist
belanglos. Mir war schon klar, dass ich dieses script. weglassen kann.


>> Um also auch die Sprache in die Abfrage miteinzubeziehen, habe ich die
>> Abfrage folgendermaßen erweitert:
>>> Select
>>> Count(CONCAT_WS("|",script.Bezeichnung, script.Sprache)) As anzahl,
>>> [...]
>>> Group By
>>> CONCAT_WS("|",script.Bezeichnung, script.Sprache)
>
> Aua!

So schlimm? Aber nachdem meine Subselect Anweisungen alle nicht so recht
funktionieren wollten, bin ich eben auf diesen "Workaround" ausgewichen.
Manchmal kommt man auf das Naheliegendste eben nicht.

Jedenfalls vielen Dank.
Erhard

Re: Alternative zu concat()

am 22.10.2007 17:48:58 von dnoeth

Erhard Rainer wrote:

> wahrscheinlich ist die Frage schon mal hier beantwortet worden

stimmt, x-mal :-)

> Ich habe eine Tabelle, die folgende Daten beinhaltet:
>
> ID | Bezeichnung | Sprache | Version
> ---+-------------+----------+--------
> 1 | Bez1 | Sprache1 | 0.1
> 2 | Bez1 | Sprache1 | 0.5
> 3 | Bez2 | Sprache1 | 0.1
> 4 | Bez1 | Sprache2 | 0.1
>
> Das Ergebniss sollte also sein: (Die Reihenfolge ist mir eigentlich egal)
>
> ID | Bezeichnung | Sprache | Version
> ---+-------------+----------+--------
> 2 | Bez1 | Sprache1 | 0.5
> 3 | Bez2 | Sprache1 | 0.1
> 4 | Bez1 | Sprache2 | 0.1
>
> mAW.: Ich suche eine Loesung, die mir die _nur_ die jeweilig hoechsten
> Versionen einer Bezeichnung, Sprache - Kombination ausgibt.

select * from tabelle t1
where version =
(select max(version) from tabelle t2
where t1.bezeichnung = t2.bezeichnung
and t1.sprache = t2.sprache)

und da manche DBMSe solche korrelierten Subqueries nicht gut optimieren,
kann man das von Hand umschreiben:

select t1.*
from tabelle t1 join
(select
bezeichnung,
sprache,
max(version) as max_version
from tabelle
group by
bezeichnung,
sprache
) t2
on t1.bezeichnung = t2.bezeichnung
and t1.sprache = t2.sprache
and t1.version = t2.max_version

Dieter