SQL abfrage
stephan
- sonstiges
0 Ilja1 stephan0 Frank (no reg)0 stephan1 Olaf Schneider0 Frank (no reg)
Hi,
wie kann ich die nächste freie Zahl im Feld ID herausfinden, die größer/kleiner der Variable $intids ist?
Danke
STEPHAN
yo,
wie kann ich die nächste freie Zahl im Feld ID herausfinden, die größer/kleiner der Variable $intids ist?
mal davon abgesehen, dass es sich wahrscheinlich um ein auto-increment wert handelt, habe ich keinen blassen schimmer, welches problem du hast, geschweige denn, welches dbms du benutzt und was du erreichen willst.
Ilja
hi,
mal davon abgesehen, dass es sich wahrscheinlich um ein auto-increment wert handelt, habe ich keinen blassen schimmer, welches problem du hast, geschweige denn, welches dbms du benutzt und was du erreichen willst.
hi, ne, kein auto increment... ich habe ein anderes feld (IDD), das zählt. und jetzt habe ich dieses id feld mit zahlen. sql-db. und ich muss jetzt herausfinden, welches die nächst größere zahl/kleinere zahl (falls es eine gibt) ist.
danke!
Hallo,
hi, ne, kein auto increment... ich habe ein anderes feld (IDD), das zählt.
Wie meinen bitte mit "das zählt"?
[ ] Es zählt selbst (in der Datenbank selbst ohne dass irgendeinen explizit von ausserhalb einen neuen (hochgezählten) Wert angeben muss? => Auto Increment
[ ] im Sinne von "nur das zählt" => nur das soll interessant sein
sql-db.
SQL = Structured Query Language = eine standardisierte Sprache zur Abfrage von relationalen Datenbanken.
MySQL, MS SQL, Oracle, PostGre, und weiss der Teufel was sonst noch mit SQL bedient werden kann. Also nochmal: Welches Datenbanksystem?
und ich muss jetzt herausfinden, welches die nächst größere zahl/kleinere zahl (falls es eine gibt) ist.
Dann finde einen Datensatz, der in der betreffenden Spalten einen Wert grösser deinem Vergleichswert hat. Bzw. Finde den Datensatz der von allen in derselben Tabelle den MAXimalsten Wert für die Spalte hat.
Für das eine benutzt du > für das andere MAX(#spalte#).
Bemühe dich in Zukunft bitte mehr, dein Problem zu detaillierter beschreiben.
Grüsse,
Frank
hi,
okay, 3. anlauf ;)
Wie meinen bitte mit "das zählt"?
[x] Es zählt selbst (in der Datenbank selbst ohne dass irgendeinen explizit von ausserhalb einen neuen (hochgezählten) Wert angeben muss? => Auto Increment
MySQL, MS SQL, Oracle, PostGre, und weiss der Teufel was sonst noch mit SQL bedient werden kann. Also nochmal: Welches Datenbanksystem?
ms sql
Für das eine benutzt du > für das andere MAX(#spalte#).
das problem ist aber, dass wenn in der db dann steht 1 2 4 5 6 und in meiner variable steht 2, dann müsste ich irgendwie rausbekommen, dass 3 noch nicht belegt ist...
geht das?
Bemühe dich in Zukunft bitte mehr, dein Problem zu detaillierter beschreiben.
versucht... besser? =)
stephan
Hallo,
eine ID ist ein Identifier, also ein Wert, mit dem man Datensätze eindeutig identifizieren kann. Daher _darf_ eine ID eines gelöschten Datensatzes nicht beim nächsten Datensatz wieder verwendet werden. Immerhin könnten auf Basis dieser ID Kundennummern, Rechnungsnummern oder Referenzen zu anderen Tabellen existieren.
Mir ist nicht ganz klar, wofür Du eine lückenlose Zahlenfolge in Deiner Tabelle haben möchtest. Wenn Du erzählst, wofür Du das brauchst, kann Dir hier bestimmt jemand weiterhelfen.
Gruß
Olaf
Hi,
das ist die Kunden-ID, die man durch Klick auf einen Button mit pfeil nach rechts und nach links höher oder niedriger (wenn das geht) machen können soll...
danke =)
stephan
Hi,
das ist die Kunden-ID, die man durch Klick auf einen Button mit pfeil nach rechts und nach links höher oder niedriger (wenn das geht) machen können soll...
Du suchst also IDs, die größer (bzw. kleiner) als die aktuelle ID sind - und willst diese Menge auf 1 limitieren.
cu,
Andreas
Hi,
Korrektur:
Du suchst also IDs, die größer (bzw. kleiner) als die aktuelle ID sind
und willst diese Menge aufsteigend (bzw. absteigend) sortieren und die Anzahl der Elemente dann auf 1 limitieren.
cu,
Andreas
hi,
genau, und diese id darf noch nicht in der db verwendet werden...
danke=)
stephan
Hallo,
warum dieses denn nicht? Damit derjenige sieht, dass es für IDD 3 keinen Kunden gibt. Und genau dies tut man nicht. Für einen neuen Kunden sollten immer nur neue Identifikationen verwenden. Und es spielt weder für den nicht-technischen Geschäftsablauf noch aus technischer Sicht eine Rolle ob die Kundennummer 3 oder 45869 ist.
Stell dir vor, deine Bank würde nach deiner Kündigung deine Kontonummer an einen neuen Kunden vergeben und irgendjemand aus dem hintersten Kabuff vergisst, dein Konto zu löschen. Der neue Kunde hat dann evt. Zugriff zu deinem Konto.
Biete einen Button an "Neuen Kunden erfassen", der zeigt eine leere Eingabemaske und das Speichern verpasst ihm eine neue Kundennummer.
In Spalten mit AutoIncrement kannst du auch nicht einfach so einen Wert einfügen, das behält sich das System vor.
Wenn du es aber unbedingt nicht anders willst. Incrementiere deinen Vergleichswert ausserhalb (=vor der Abfrage) um 1 und Frage dann die Datenbank ob sie für diese Wert (2+1 = 3) einen Datensatz hat.
IF NOT EXISTS(SELECT 1 FROM tabelle WHERE IDD = @deineVariable)
SET IDENTITY_INSERT tabelle ON
INSERT tabelle (Id, feld, feld)
VALUES (3, NULL, NULL)
SET IDENTITY_INSERT tabelle OFF
END
SELECT feld, feld, feld FROM tabelle WHERE IDD = @deineVariable
Es ist wieder optimal noch überhaupt sinnvoll, ein künstlich generiertes Problem so zu lösen.
Wenn du nicht willst, dass Lücken entstehen, dann verhindere physikalische Löschungen und setze nur ein Flag (active = 0 | 1) für den Datensatz. Dieses Flag kannst du dann zusätzlich auswerten und die Anzeige entsprechend anders gestalten.
Cheers,
Frank
Ja, schon etwas besser. (du hättest es eben schon im Ausgangsposting bringen können)
Du willst den nächst höheren der existiert oder einen numerisch um X höheren der evt. nicht existiert und wissen ob dieser existiert?
Wenn ich das nochmal durchlese, drängt sich mir der Gedanke auf, du möchtest Auto-Increment Lücken füllen? Das macht man eigentlich nicht. Über das warum gibt es hier im Forum seitenweise Beiträge. Ich bezweifle, dass du ausgerechnet einer der Fälle bist, wo man das eigentliche Problem nicht auf elegantere und vorallem andere Weise lösen könnte. Im konkreten Fall versuchst du jetzt schon ein künstliches Problem zu lösen "wie bekomme ich die Lücken", was den Aufwand nicht wert ist.
Bei einem integer unterscheiden sich Werte für auto-increment immer um mindestens 1. D.h. du suchst einen Datensatz, der genau in Spalte IDD eine 3 drinstehenhat, bei Vergleichswert 2677 dann halt 2678? Richtig?
SELECT CASE WHEN EXISTS(SELECT 1 FROM tabelle WHERE IDD = (@deinVergleichwert + 1)) THEN 1 ELSE 0 END
Andere Situation, deine Zahlenreihe in IDD ist weiterhin 1 2 4 5 6, deine Variable aber 1, willst du dann immer noch 3 als Ergebnis haben?
Ciao, Frank
puha, das hab ich jetzt nicht ganz geblickt =)
das feld ID ist für Kunden-ID-Nummern, IDD ist die typische Auto-Increment-ID. Und der benutzer soll über Buttons nach rechts / Links die nächst höhere/kleinere Nummer für den Kunden wählen können...
danke =)
stephan
Hi,
na dann
SELECT TOP 1 feld, feld, feld
FROM tabelle
WHERE IDD > @deineVariable
ORDER BY IDD
gibt dir den 1. Datensatz, dessen IDD grösser als dein Vergleichswert ist. Das ORDER BY ist wichtig für TOP n SELECTs.
Das ganze schreibst du dir einfach als StoredProcedure mit einem Eingabeparameter und rufst sie für Buttonklick "rechts" auf.
Für Rückwärtslaufen "links" brauchst du nur > in < ändern.
Cheers,
Frank