Autor Beitrag
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Do 21.06.12 17:05 
Hallo Leute,

ich würde gerne wissen, ob sich mittels SQL folgende Aufgabenstellung lösen lässt.

Und zwar habe ich folgende Tabellen Struktur:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
ID  Irgendwas  EinBool
1      dsad      false
2      juzu      false
3      dsak      true
4      khjh      false
5      1234      false
6      5678      false



Ich möchte die letzten Datensätze bis zum ersten true selektieren.

Das Ergebnis soll so aussehen:

ausblenden Quelltext
1:
2:
3:
4:
5:
ID  Irgendwas  EinBool
3      dsak      true
4      khjh      false
5      1234      false
6      5678      false



Ist das überhaupt möglich? Über Tipps und Anregungen freue ich mich wie immer!

_________________
Gruß
Christoph
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 21.06.12 17:55 
Wenn ID dein Kriterium für die Reihenfolge ist dann

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
SELECT * 
  FROM table
 WHERE ID >= (SELECT min(ID)
                FROM table
               WHERE EinBool = 'true')


Sollte eigentlich in jeder halbwegs ANSI konformen DB funktionieren. Das Verhalten eines Bool, wenn die DB den Typ überhaupt kennt, ist das einzige DB spezifische (ob 1,0 oder true, false oder 'true', 'false' oder ...).
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Do 21.06.12 19:45 
Ah super! Meine theoretische Lösung hat ähnlich ausgesehen. Ich werde mich morgen mal an die Umsetzung machen.

Vielen Dank schon mal!

_________________
Gruß
Christoph
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 21.06.12 20:54 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
SELECT * 
  FROM table
 WHERE ID >= (SELECT min(ID)
                FROM table
               WHERE EinBool = 'true')

Das haut hin solange in der Tabelle nur ein 'true' drinne ist. Sind es mehr wird alles ab dem ersten geliefert. Es soll aber alles ab dem letzten geliefert werden wenn ich das richtig verstanden habe.
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
SELECT *
  FROM table
 WHERE ID >= (SELECT TOP 1 ID
                FROM table
               WHERE EinBool = 'true' ORDER BY ID DESC)

Irgendwie habe ich zwar das Gefühl das es noch einfacher geht aber ich komme nicht drauf.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 21.06.12 21:21 
Zitat:
Das haut hin solange in der Tabelle nur ein 'true' drinne ist. Sind es mehr wird alles ab dem ersten geliefert


Christoph hat geschrieben

Zitat:
Ich möchte die letzten Datensätze bis zum ersten true selektieren.


Sollte Christoph gemeint haben was er schrieb ist min(ID) richtig und man kann halt dann auch mehrere Datensätze mit EinBool = true im Ergebnis haben. Ist deine Interpretation richtig dann machen wir halt aus dem min(ID) ein max(ID). Vermutlich ist ein min bzw. max auch schneller als Top + Order by (ASC oder DESC).

Zitat:
Irgendwie habe ich zwar das Gefühl das es noch einfacher geht aber ich komme nicht drauf.


Einfacher wird es nicht. Man hat immer einen Vergleich mit anderen Datensätzen in der gleichen Tabelle. Die Tabelle wird also immer 2 mal gebraucht werden. Alternativ kann man auch Lösungen mit einem Self-Join versuchen. Sind aber nicht einfacher und persönlich halte ich einen Subselect für lesbarer als einen Self-Join.
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Fr 22.06.12 20:34 
Vielen Dank euch beiden! Ich habe den Vorschlag von Ralf übernommen, nach dem ich das min auf max geändert habe, hat diese genau das geliefert, was ich brauchte. SQL finde ich wirklich gut, wenn man erst mal sieht wie etwas gemacht werden kann, dann erscheint es immer logisch. Mit etwas Übung kann man doch recht kreativ sein. Schade das ich nicht häufiger damit zu tun habe....

_________________
Gruß
Christoph