Code: Alles auswählen
create table blabla(id_von integer, id_bis integer, name cichar(30));
insert into blabla(id_von, id_bis, name) values
(1, 1000, 'Kevin'),
(1001, 2000, 'Pascal'),
(2001, 3000, 'Elli'),
(2999, 4000, 'Falsch');
Ich gehe so vor:
1. die Tabelle mit sich selber kreuzen (INNER JOIN) auf alle Datensätze, bei denen b.von<a.bis:
Code: Alles auswählen
select a.*, b.* from blabla b
inner join blabla a on b.id_von<a.id_bis
2. Das Ergebnis weiter einschränken auf alle Datensätze, bei welchen b.bis>a.bis
Code: Alles auswählen
select a.*, b.* from blabla b
inner join blabla a on b.id_von<a.id_bis
and b.id_bis>a.id_bis
3. Evtl noch die Datensätze wegnehmen, bei denen a und b denselben anzeigen (bei <> nicht notwendigt, aber falls >= oder <= verwendet werden)
Code: Alles auswählen
select a.*, b.* from blabla b
inner join blabla a on b.id_von<a.id_bis
and b.id_bis>a.id_bis
and b.rowid<>a.rowid
Das Ergebnis ist dann erst der richtige Datensatz und darauf folgend der, der die Überschneidung begeht:
2001 3000 Elli 2999 4000 Falsch