選択クエリで自動インクリメントフィールドを生成する方法


84

たとえば、2つの列がfirst_nameありlast_name、これらの値を持つテーブルがあります

Ali           Khani
Elizabette    Amini
Britney       Spears
,...

次のselectようなテーブルを生成するクエリを作成したいと思います。

1     Ali           Khani
2     Elizabette    Amini
3     Britney       Spears
,...

ご協力いただきありがとうございます。


1
どのRDBMSを使用していますか?
peterm 2013年

回答:


147

MySqlの場合は、試すことができます

SELECT @n := @n + 1 n,
       first_name, 
       last_name
  FROM table1, (SELECT @n := 0) m
 ORDER BY first_name, last_name

SQLFiddle

そしてSQLServerの場合

SELECT row_number() OVER (ORDER BY first_name, last_name) n,
       first_name, 
       last_name 
  FROM table1 

SQLFiddle


1
私は何からすべての列をseleectしたい場合はtable1代わりにfirst_namelast_name、どのように私はすべてを参照することができますか?試行SELECT @n := @n + 1 n, *しても機能しません
PlainOldProgrammer 2015年

答えはSELECT @n := @n + 1 n, table1.*
PlainOldProgrammer 2015年

1
MYSQLでは、@n初期化する必要があるかもしれません: SET @n = 0;
サンフランシスコR

2
@FranciscoR詳しく見てください(SELECT @n := 0)。サブクエリですでに初期化されています。このアプローチの隠れた美しさは、2つではなく1つのステートメントがあることです。これは、クライアントコードで複数のステートメントが禁止されている場合に適しています。
peterm 2015

33

ここのためだSQL server, Oracle, PostgreSQLサポート窓口機能。

SELECT  ROW_NUMBER() OVER (ORDER BY first_name, last_name)  Sequence_no,
        first_name,
        last_name
FROM    tableName

4

自然なパーティション値がなく、パーティションに関係なく順序付けられた番号が必要な場合は、定数に対してrow_numberを実行できます。次の例では、「X」を使用しました。これが誰かを助けることを願っています

select 
    ROW_NUMBER() OVER(PARTITION BY num ORDER BY col1) as aliascol1, 
    period_next_id, period_name_long
from 
(
  select distinct col1, period_name_long, 'X' as num
  from {TABLE} 
) as x

1
DECLARE @id INT 
SET @id = 0 
UPDATE cartemp
SET @id = CarmasterID = @id + 1 
GO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.