Limit

Habana

Grünschnabel
Angenommen ich möchte von einer Tabelle mit den Values(name, alter) die zwei ältesten Personen selektieren, ohne dabei limit zu verwenden. Es sollen dazu auch keine Statements wie rownum oder ähnliches verwendet werden. Wie stelle ich soetwas an?
 
Limit. Kenne ich nur von MySQL. Also gehe ich mal davon aus, dass du mit MySQL arbeitest. In anderen Datenbanken wird es anderst gelöst.

Warum soll Limit nicht verwendet werden? Warum das Leben kompliziert machen, wenn es einfache Lösungen gibt?
 
ja, ich verwende mysql.
Das ist eine Aufgabe die mir ein Professor in einem Test gestellt hat und ich frage mich nun wie man so etwas denn lösen könnte.
 
Eine Methode:
Zähle alle, die noch älter sind. Und nehme nur diejenigen, bei denen der Zähler kleiner 2 ist (also 0 und 1)
SQL:
select 
	t.*
from t405578 t
where 
	(
		select count(*) 
		from t405578 t1 
		where t1.age > t.age
	) < 2
 
Stimmt.
Kannst du mir auch erklären was da genau Passiert im inneren Ausdruck und warum <2 beim Äußeren?
 
Ja, das ist mir klar, aber wie arbeitet SQL das ab.
SELECT count(*) FROM t405578 t1 gibt mir ja die gesamt Zahl der Einträge aus, also z. B. 10.
Iteriert SQL in dem Fall durch die Liste und nummeriert 1, 2, 3, 4,.. bis 10 oder wie Funktioniert das?
 
Der Subselect hat auch ein WHERE das nicht vergessen werden darf!
Pro Zeile des äusseren Select geht er hin und Zäjlt, wieviele Eintrage es hat, bei denen das Alter höher ist als beim Eintrag. Und dann nimmt er alle, bei denen das unter 2 ist.

Hier ein Beispiel

Meine Testdaten
SQL:
select *
from t405578;

ID    AGE
1    5
2    8
3    6
4    7

Dann mit der Unterabfrage als Feld, damit man sieht, was ermittelt wird
SQL:
select
    t.*,
    (
        select count(*)
        from t405578 t1
        where t1.age > t.age
    ) as count_older_items
from t405578 t;

ID    AGE    count_older_items
1    5    3
2    8    0
3    6    2
4    7    1
Man erkennt, der Älteste hat 0, der 2t Älteste hat 1 etc.

und als fertiges SQL
SQL:
select
    t.*
from t405578 t
where
    (
        select count(*)
        from t405578 t1
        where t1.age > t.age
    ) < 2;

ID    AGE
2    8
4    7
 
Moin Yaslaw und Habana,

es gibt aber Punktabzug, wenn in den Daten "die beiden Ältesten" zufällig gleich alt sind.

Wenn da - wie es der Prof durchaus konstruiert haben könnte - nur zwei Hundertjährige und ihre 87 Enkel enthalten sind, dann bekommst du KEIN Ergebnis mit Yaslaws Strategie

Daher würde noch enmal kurz erwägen eine Alternative/Variante mit "wo das Alter gleich dem Max(Alter) From Table ist "

Grüße
Biber
 

Neue Beiträge

Zurück