2016-07-08 16 views
2

私は 'JobCardNum'という列を持つデータベース(ジョブカード)にテーブルを持っています。これはテーブルの主キーですが、特定のジョブカードが削除されている可能性があるため、ギャップがあります。このクエリを実行する方法

例えば数2000と2002でジョブカードが存在するが、私は必要なものなし2001

が存在しないことへの入力としてジョブ・カード番号を取り、次のジョブ・カード番号があればどうなるか見つけることです列は昇順になっています。

'$のnumが' 私の消毒入力されるようならば、私は

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

ようなものが必要しかし、その後、 '次へ' JobCardNumを取得します。

私はすべてのJobCardの配列を返すことができますが、必要なものを抽出することができますが、何千ものエントリがある可能性があるので、これは非効率的です。

任意のアイデア

+0

mysqlまたはMicrosoft sql-server? – Drew

+0

@Drew Microsoft SQL Serverタグは 'sql-server'ではなく' sql-server'です。 –

+0

mySQLは私が必要としている –

答えて

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

テーブルはどこで指定できますか? –

+0

MySQLは 'FROM'節を欠いているだけでなく、' TOP'ではなく 'LIMIT'構文を使います。 –

+0

@Drew自分で投稿するのではなく、自分の答えを編集したのはなぜですか? – Siyual

1

あなただけのJobCardNumをしたい場合は、これはすべてのSQL方言で有効です。

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

MySQLの場合、あなたはこれを使用することができますすべての列を取得する:

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

あなたはMySQLのLIMITに頼るのではなく、ANSI SQLを使用したい場合:

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

代わりJobCardNum = $numを設定するあなたはJobCardNumがより大きいか$num等しくなければならないことを言うことができる:

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

JobCardNumの場合、最小値が$numのすべてのデータのリストを返します。 1つの結果だけが必要なので、1に制限することができます。

"SELECT * FROM JobCards WHERE JobCardNum >= $num ORDER BY 'JobCardNum' asc LIMIT 1" 
関連する問題