Cách tạo trường tăng tự động trong truy vấn chọn


82

Ví dụ: tôi có một bảng có 2 cột first_namelast_namevới các giá trị này

Ali           Khani
Elizabette    Amini
Britney       Spears
,...

Tôi muốn viết một selecttruy vấn tạo một bảng như sau:

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

Cảm ơn bạn đã giúp đỡ.


1
Bạn đang sử dụng RDBMS nào?
peterm

Câu trả lời:


144

Nếu đó là MySql, bạn có thể thử

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

SQLFiddle

Và đối với SQLServer

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

SQLFiddle


1
Nếu tôi muốn seleect tất cả các cột từ table1thay first_namelast_name, làm thế nào tôi có thể tham khảo tất cả? Cố gắng SELECT @n := @n + 1 n, *không hiệu quả
PlainOldProgrammer

Câu trả lời làSELECT @n := @n + 1 n, table1.*
PlainOldProgrammer

1
Trong MYSQL, bạn có thể cần khởi tạo @n:SET @n = 0;
Francisco R

2
@FranciscoR Vui lòng xem kỹ hơn, nó đã được khởi tạo trong truy vấn con (SELECT @n := 0). Vẻ đẹp tiềm ẩn của phương pháp này là bạn có một câu lệnh duy nhất thay vì hai câu lệnh, điều này rất tốt khi nhiều câu lệnh bị cấm trong mã khách hàng của bạn.
peterm

33

đây là SQL server, Oracle, PostgreSQLnhững chức năng hỗ trợ cửa sổ.

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

4

Trong trường hợp bạn không có giá trị phân vùng tự nhiên và chỉ muốn một số có thứ tự bất kể phân vùng nào, bạn chỉ có thể thực hiện một row_number trên một hằng số, trong ví dụ sau, tôi đã sử dụng 'X'. Hy vọng điều này sẽ giúp ai đó

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.