2016-07-08 20 views
2

So habe ich eine Tabelle in meiner Datenbank (Job Cards), die eine Spalte namens "JobCardNum" hat. Dies ist der Primärschlüssel für die Tabelle, es gibt jedoch Lücken, da eine bestimmte Jobkarte möglicherweise gelöscht wurde.So führen Sie diese Abfrage aus

Zum Beispiel der Jobkarten mit der Nummer 2000 und 2002 existieren, aber es gibt keine 2001

Was ich brauche, ist eine Jobcard Nummer als eine Eingabe und finden Sie, was die nächste Job Kartennummer sein würde, wenn die Spalte war in aufsteigender Reihenfolge.

Also, wenn '$ num' mein hygienisiert Eingang ist, brauche ich so etwas wie

"SELECT * FROM JobCards WHERE JobCardNum = $num ORDER BY 'JobCardNum' [asc]" 

Aber dann die 'next' JobCardNum bekommen.

Ich weiß, ich könnte ein Array aller Speicherkarten zurückgeben dann extrahieren, den ich brauche, aber es könnte Tausende von Einträgen sein, damit diese ineffizient zu sein scheint.

Irgendwelche Ideen

+0

mysql oder Microsoft SQL-Server? – Drew

+0

@Drew Das Microsoft SQL Server-Tag ist 'sql-server', nicht' sql'. –

+0

mySQL ist, was ich brauche –

Antwort

2
SELECT TOP 1 JobCardNum FROM JobCards WHERE JobCardNum > $num ORDER BY JobCardNum asc 

mysql:

SELECT JobCardNum from someTable WHERE JobCardNum > $num ORDER BY JobCardNum limit 1 
+0

Wo gebe ich die Tabelle an? –

+0

Zusätzlich zur fehlenden FROM-Klausel verwendet MySQL die LIMIT-Syntax, nicht TOP. –

+0

@Drew Warum haben Sie Ihre eigene Antwort darauf bearbeitet, anstatt Ihre eigenen zu veröffentlichen? – Siyual

1

Wenn Sie die JobCardNum will nur dann ist dies in allen SQL-Dialekte gültig:

SELECT MIN(JobCardNum) AS JobCardNum 
FROM JobCards 
WHERE JobCardNum >= $num 

Für MySQL Sie diese verwenden können um alle Spalten zu erhalten:

SELECT 
    JobCardNum, 
    SomeOtherColumn, 
    ... <list the columns, never use SELECT *> 
FROM 
    JobCards 
WHERE 
    JobCardNum >= $num 
LIMIT 1 

Wenn Sie ANSI SQL, anstatt auf MySQL LIMIT verwenden wollte: sagen

SELECT 
    JobCardNum, 
    SomeOtherColumn, 
    ... <list the columns, never use SELECT *> 
FROM 
    JobCards JC 
WHERE 
    JobCardNum = (SELECT MIN(JobCardNum) AS JobCardNum FROM JobCards WHERE JobCardNum >= $num) 
1

Statt JobCardNum = $num Einstellung könnte größer sein, dass JobCardNum sollte als oder gleich $num:

"SELECT * FROM JobCards WHERE JobCardNum >= $num ORDER BY 'JobCardNum' asc" 

Dies wird eine Liste aller Daten mit einem Minimum von $num für JobCardNum zurückgeben. Wie Sie gerade ein Ergebnis wollen, könnten Sie es auf 1 begrenzen:

"SELECT * FROM JobCards WHERE JobCardNum >= $num ORDER BY 'JobCardNum' asc LIMIT 1" 
Verwandte Themen