Tôi không phải là tốt nhất trong SQL rất tiếc nếu tôi đặt câu hỏi ngu ngốc :)SQL - điều kiện đệ quy trong mệnh đề SELECT
Hãy có một bảng như thế này:
|id| name | nickname |
|==|========|============|
| 1| Jo| Banana|
| 2|Margaret|The Princess|
| 3| Perry| The Monkey|
| 4|Margaret| The Queen|
| 5| | The Rat|
| 6| | The Cat|
nơi nickname
luôn là độc nhất.
Và tôi đang cố gắng để có được kết quả như thế này:
|id| name | nickname | display_name |
|==|========|============|=======================|
| 1| Jo| Banana| Jo|
| 2|Margaret|The Princess|Margaret (The Princess)
| 3| Perry| The Monkey| Perry|
| 4|Margaret| The Queen| Margaret (The Queen)|
| 5| | The Rat| The Rat|
| 6| | The Cat| The Cat|
Về cơ bản logic là:
- Nếu
name
là trống sau đódisplay_name = 'nickname'
- Nếu
name
là độc đáo sau đódisplay_name = 'name'
- Nếu
name
là not_unique sau đódisplay_name = 'name (nickname)'
Tôi có thể đạt được điều đó chỉ với một truy vấn SQL? Nếu vậy - làm thế nào? Nếu không - các lựa chọn thay thế là gì?
Hiện tại tôi làm điều đó bằng ngôn ngữ lập trình nhưng tôi phải gửi cho mỗi hàng kết quả truy vấn SQL khác để kiểm tra xem có các bản ghi khác có cùng tên OK cho kết quả được lọc hay không, nhưng quá tham lam khi truy xuất toàn bộ bảng (4 000 hàng và tăng trưởng).
Hi @ john-bollinger, cảm ơn bạn đã trả lời. Hai câu hỏi chỉ xuất hiện trong tâm trí của tôi: 1) Lệnh 'OVER (PARTITION BY)' chỉ dành cho 'sqlserver'? 2) Tại sao 'row_number' sẽ không hoạt động? Cảm ơn –
@AndyK, mệnh đề 'OVER()' là những gì làm cho 'COUNT()' một hàm cửa sổ thay vì hàm tổng hợp. Đây là các tính năng SQL tiêu chuẩn kể từ SQL2003, được mở rộng trong SQL2008. Nhiều cơ sở dữ liệu SQL khác với SQL Server thực hiện chúng (Oracle và PostgreSQL là hai trong số nhiều), nhưng không phải tất cả (MySQL là một trong những ngoại lệ nổi bật hơn). –
@AndyK, hàm 'ROW_NUMBER()' trả về số thứ tự của hàng hiện tại liên quan đến phân vùng và/hoặc thứ tự được xác định bởi mệnh đề 'OVER()'. Điều đó cho phép bạn nhận ra các hàng thứ hai và tiếp theo của bất kỳ phân vùng nào thuộc về một phân vùng có nhiều hơn một hàng, nhưng khi số hàng là '1' bạn không biết liệu có bất kỳ hàng tiếp theo nào trong phân đoạn của hàng đó hay không. –