Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để xóa các hàng trùng lặp khỏi chế độ xem?

DISTINCT sẽ không giúp bạn nếu các hàng có bất kỳ cột nào khác nhau. Rõ ràng, một trong những bảng bạn đang tham gia có nhiều hàng cho một hàng trong bảng khác. Để lấy lại một hàng, bạn phải loại bỏ nhiều hàng khác trong bảng mà bạn đang tham gia.

Cách dễ nhất để làm điều này là tăng cường mệnh đề where hoặc hạn chế JOIN của bạn để chỉ tham gia vào bản ghi duy nhất mà bạn muốn. Thông thường, điều này yêu cầu xác định một quy tắc sẽ luôn chọn mục nhập 'đúng' từ bảng khác.

Hãy để chúng tôi giả sử bạn gặp một vấn đề đơn giản như sau:

Person:  Jane
Pets: Cat, Dog

Nếu bạn tạo một kết hợp đơn giản tại đây, bạn sẽ nhận được hai bản ghi cho Jane:

Jane|Cat
Jane|Dog

Điều này hoàn toàn chính xác nếu quan điểm của bạn là liệt kê tất cả các tổ hợp giữa người và vật nuôi. Tuy nhiên, nếu chế độ xem của bạn thay vào đó được cho là liệt kê những người có vật nuôi hoặc liệt kê mọi người và hiển thị một trong những vật nuôi của họ, thì bạn đã gặp phải vấn đề hiện tại. Đối với điều này, bạn cần một quy tắc.

SELECT Person.Name, Pets.Name
FROM Person
  LEFT JOIN Pets pets1 ON pets1.PersonID = Person.ID
WHERE 0 = (SELECT COUNT(pets2.ID) 
             FROM Pets pets2
             WHERE pets2.PersonID = pets1.PersonID
                AND pets2.ID < pets1.ID);

Điều này làm là áp dụng một quy tắc để hạn chế bản ghi Vật nuôi trong phần tham gia đối với Vật nuôi có ID thấp nhất (đầu tiên trong bảng Vật nuôi). Về cơ bản, mệnh đề WHERE cho biết "không có vật nuôi nào thuộc về cùng một người có giá trị ID thấp hơn).

Điều này sẽ mang lại một kết quả kỷ lục:

Jane|Cat

Quy tắc bạn sẽ cần áp dụng cho chế độ xem của mình sẽ phụ thuộc vào dữ liệu trong các cột bạn có và bản ghi 'nhiều' nào sẽ được hiển thị trong cột. Tuy nhiên, điều đó sẽ kết thúc với việc ẩn một số dữ liệu, có thể không phải là những gì bạn muốn. Ví dụ, quy tắc trên che giấu sự thật rằng Jane có một con Chó. Nó làm cho nó có vẻ như Jane chỉ có một con Mèo, khi điều này không chính xác.

Bạn có thể cần phải suy nghĩ lại về nội dung của chế độ xem và những gì bạn đang cố gắng đạt được với chế độ xem của mình, nếu bạn đang bắt đầu lọc ra dữ liệu hợp lệ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo chỉ mục trên một biến bảng

  2. Khắc phục “Ít nhất một trong các đối số đối với COALESCE phải là một biểu thức không phải là hằng số NULL” trong SQL Server

  3. 6 cách để kiểm tra xem một bảng có tồn tại trong SQL Server hay không (ví dụ T-SQL)

  4. Lỗi kết nối SQL:System.Data.SqlClient.SqlException (0x80131904)

  5. Cách xóa một ký tự cụ thể khỏi chuỗi, chỉ khi nó là ký tự đầu tiên hoặc cuối cùng trong chuỗi.