web-dev-qa-db-ja.com

SQL-列の最大数を見つける方法

Customersテーブルに次のデータがあるとしましょう:(これ以上)

ID   FirstName   LastName
-------------------------------
20   John        Mackenzie
21   Ted         Green
22   Marcy       Nate

ID列で、どのようなSELECTステートメントで番号22を取得できますか?

一意のIDを生成するには、このようなことをする必要があります。システムに自動インクリメントでこれを実行させることはできますが、自動生成されたIDを取得するにはどうすればよいですか?

「SELECT ID FROM Customers」を考えて、返された行をカウントしましたが、これはひどく非効率的で、この場合、23という一意のIDが必要ですが、誤って「3」を返します。

45
Robinicks

できるよ

SELECT MAX(ID) FROM Customers;
103
notnoop

Customersテーブルにレコードを挿入したばかりで、最近入力されたIDフィールドの値が必要な場合は、SCOPE_IDENTITY関数を使用できます。これは、SCOPE_IDENTITYの呼び出しと同じスコープ内でINSERTが発生した場合にのみ役立ちます。

INSERT INTO Customers(ID, FirstName, LastName)
Values
(23, 'Bob', 'Smith')

SET @mostRecentId = SCOPE_IDENTITY()

これはあなたにとって役に立つかもしれないし、そうでないかもしれませんが、知っておくと良いテクニックです。また、自動生成された列でも機能します。

16
David Andres
SELECT * FROM Customers ORDER BY ID DESC LIMIT 1

次に、IDを取得します。

10
Joel Enanod Jr
select max(id) from customers
8
deostroll

いつでも取得するには、SELECT MAX(Id) FROM Customersを実行できます。

ただし、追加するプロシージャでは、SCOPE_IDENTITY-を使用して、そのプロシージャによって最後に追加されたIDを取得することもできます。
これは、Idを取得することを保証するため、安全です。他のデータベースが同時にデータベースに追加される場合に備えて。

8
Brisbe

MS SQLを使用している場合、ここが最も効率的な方法です。これにより、IDである列に基づいてテーブルから現在のIDシードが取得されます。

_select IDENT_CURRENT('TableName') as LastIdentity
_

MAX(id)の使用はより一般的ですが、たとえば、MAX(id)を取得するのに2分かかる4億行のテーブルがあります。 _IDENT_CURRENT_はほぼ瞬時に...

7
Damon
select max(id) from Customers 
6
monksy

AUTOINCREMENTを使用している場合は、次を使用します。

SELECT LAST\_INSERT\_ID();

Mysqlを使用していると仮定すると: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

Postgresはcurrval(sequence_name)関数を介してこれを同様に処理します。

テーブルをロックしない限り、MAX(ID)を使用しても安全ではないことに注意してください。MAX(ID)を呼び出して、最初の挿入。上記の関数はセッションベースであるため、別のセッションが挿入されても、挿入したIDを取得できます。

4
Steven Graham

リレーショナル代数を使用することもできます。少し長い手順ですが、ここではMAX()がどのように機能するかを理解するだけです。

E:=πID (テーブル名)
E1:=πID (σID> = ID ' ((ρID ' E)⋈E))–πID (σID <ID ’ ((ρID ' E)⋈E))

あなたの答え:Table_Name⋈E1

基本的にあなたがすることは、a、b∈AであるAからa<bである順序付き関係(a、b)のセットを引くことです。

関係代数記号については、以下を参照してください。 Wikipediaからの関係代数

2
Arnab Das

自動インクリメントフィールドを使用していない場合、次のようなもので同様の結果を達成できます。

insert into Customers (ID, FirstName, LastName)
    select max(ID)+1, 'Barack', 'Obama' from Customers;

これにより、最大IDの抽出と新しいレコードの挿入の間に他の誰かがテーブルに挿入することによって競合状態が発生する可能性がなくなります。

これは標準SQLを使用しているため、特定のDBMSでそれを実現するより良い方法があることは間違いありませんが、それらは必ずしも移植性があるとは限りません(私たちの店では非常に真剣に考えています)。

2
paxdiablo

idのみを選択する場合は、select max(id) from customerを使用します。

行全体を選択する場合は、次のようなクエリを使用します。

select c1.*
from customer c1, (select max(id) as max_id from customer )c2 
where c1.id=c2.max_id

c2は、max idを含む新しい一時テーブルのエイリアスです。次に、そのクロス積をcustomerテーブルで取得して、行全体を取得します。

ここでは、from句でクエリを記述しています。これは非常に便利です。

0
Rachit

使用しているSQL実装に依存します。たとえば、MySQLとSQLiteの両方に、最後の挿入IDを取得する方法があります。実際、PHPを使用している場合は、そのmysql_insert_id()のための気の利いた関数さえあります。

最大の挿入IDを取得するためだけにすべての行を調べるのではなく、このMySQL機能を使用することをお勧めします。テーブルが大きくなると、非常に非効率になる可能性があります。

0
sohum