MS SQL JOIN Problem

stefan2k

Grünschnabel
Hallo,
ich habe folgendes Problem:

Ich habe z.B. 2 Tabellen (Personen und Auto)

Personen:
ID | Name
----------------
1 | Klaus
2 | Hans
3 | Peter


Autos:
ID | PersonID | PS
---------------------------
1 | 1 | 100
2 | 1 | 200
3 | 2 | 300
4 | 2 | 200


Das Ergebnis soll sein:
Name | AutoID | PS
----------------------------
Klaus | 2 | 200
Hans | 3 | 300

Also ein Join zwischen Personen und Autos.
Im Ergebnis soll jede Person nur einmal vorkommen, mit ihrem PS-Stärksten Auto.

Ich habe bereits diverse Lösungsansätze verfolgt, aber ans Ziel führte mich nur eine Variante mit einem Subselect.

Nun meine Frage:
Da es in Realität eine wesentlich komplexere Datenbank mit extremen Datenmengen ist, macht sich der Subseelct extrem bemerkbar bei der Performance,
kennt jemand noch einen besseren Weg?
 
Herzlichen Glückwunsch zu deinem neuen 486 66Mhz Turbo. :D
Ein Subselect hat eigentlich nur Performance-Vorteile.

Wäre mal toll deinen Query zu sehen der so langsam sein soll.

Optional hier noch einer von mir:
Code:
SELECT
  `Personen`.`Name`,
  `B`.`AutoID`,
  `B`.`PS`
FROM `Personen`
INNER JOIN (
  SELECT `AutoID`, `PS`
  FROM `Autos`
  ORDER BY `PS` ASC
  GROUP BY `PersonID`
) AS B

Hoffe das klappt so mit ORDER und GROUP gleichzeitig. Sonst mal DESC statt ASC versuchen.
Benutzt du überhaupt MySQL?
 
Tja wenns so einfach wäre, das war auch einer meiner Ansätze, allerdings ist allen schon

SELECT `AutoID`, `PS`
FROM `Autos`
ORDER BY `PS` ASC
GROUP BY `PersonID`

kein gültigest SQL Statement.

Mein SELECT_Statement war ungefähr so:

SELECT
Person.Name,
(SELECT TOP 1 ID FROM Auto ORDER BY PS DESC WHERE Auto.PersonId = Person.ID) as AutoID,
(SELECT TOP 1 PS FROM Auto ORDER BY PS DESC WHERE Auto.PersonId = Person.ID) as PS
From Person

Allerdings ist es einfach extrem langsam.

Trotzdem Danke für den Versuch.

Das war der Punkt, wo ich nicht weiter wusste, wie gruppiere ich quasi die Auto-Tabelle, wenn ich den größten PS-Wert brauche, da
".. it is not contained in either an aggregate function or ..." kennen wir ja.
 
Zuletzt bearbeitet:
Zurück