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

Sử dụng DISTINCT bên trong JOIN sẽ gây ra sự cố

Một cách tiếp cận là sử dụng dạng xem nội tuyến, giống như truy vấn bạn đã có. Nhưng thay vì sử dụng DISTINCT, bạn sẽ sử dụng GROUP BY để loại bỏ các bản sao. Chế độ xem nội tuyến đơn giản nhất để đáp ứng yêu cầu của bạn sẽ là:

( SELECT n.item_number, n.name, n.type_code
    FROM itpitnam n
   GROUP BY n.item_number
) itpitnam

Mặc dù nó không xác định về hàng nào từ itpitnam nhưng các giá trị cho tên và mã kiểu được truy xuất từ ​​đó. Chế độ xem nội tuyến phức tạp hơn có thể làm cho điều này cụ thể hơn.

Một cách tiếp cận phổ biến khác đối với loại vấn đề này là sử dụng một truy vấn con tương quan trong danh sách CHỌN. Để trả về một tập hợp nhỏ các hàng, điều này có thể hoạt động khá tốt. Nhưng để trả về các tập hợp lớn, có nhiều cách tiếp cận hiệu quả hơn.

SELECT i.identifier
     , i.name
     , i.subtitle
     , i.description
     , i.itemimg 
     , i.mainprice
     , i.upc
     , i.isbn
     , i.weight
     , i.pages
     , i.publisher
     , i.medium_abbr
     , i.medium_desc
     , i.series_abbr
     , i.series_desc
     , i.voicing_desc
     , i.pianolevel_desc
     , i.bandgrade_desc
     , i.category_code
     , r.overall_ranking
     , ( SELECT n1.name
           FROM itpitnam n1
          WHERE n1.item_number = r.item_number
          ORDER BY n1.type_code, n1.name
          LIMIT 1
       ) AS artist
     , ( SELECT n2.type_code
           FROM itpitnam n2
          WHERE n2.item_number = r.item_number
          ORDER BY n2.type_code, n2.name
          LIMIT 1
       ) AS type_code
  FROM itpitems i
  JOIN itprank r
    ON r.item_number = i.identifier
 WHERE mainprice > 1
 LIMIT 3

Truy vấn đó sẽ trả về tập kết quả được chỉ định, với một sự khác biệt đáng kể. Truy vấn ban đầu hiển thị INNER JOIN tới itpitnam bàn. Điều đó có nghĩa là một hàng sẽ được trả về CHỈ khi có một hàng phù hợp trong itpitnam bàn. Tuy nhiên, truy vấn ở trên mô phỏng OUTER JOIN, truy vấn sẽ trả về một hàng khi không tìm thấy hàng phù hợp nào trong itpitnam .

CẬP NHẬT

Để có hiệu suất tốt nhất của các truy vấn con tương quan đó, bạn sẽ muốn có một chỉ mục thích hợp,

... ON itpitnam (item_number, type_code, name)

Chỉ mục đó là thích hợp nhất vì nó là "chỉ mục bao gồm", truy vấn có thể được đáp ứng hoàn toàn từ chỉ mục mà không cần tham chiếu đến các trang dữ liệu trong bảng bên dưới và có vị từ bình đẳng trên cột đầu và một LỆNH BẰNG trên hai cột tiếp theo, do đó sẽ tránh được một hoạt động "sắp xếp".

-

Nếu bạn có đảm bảo rằng type_code hoặc name cột trong bảng itpitnam KHÔNG ĐẦY ĐỦ, bạn có thể thêm một vị từ để loại bỏ các hàng "thiếu" một hàng phù hợp, ví dụ:

HAVING artist IS NOT NULL

(Việc thêm điều đó có thể sẽ ảnh hưởng đến hiệu suất.) Nếu không có loại đảm bảo đó, bạn cần thêm INNER JOIN hoặc một vị từ kiểm tra sự tồn tại của một hàng phù hợp, để có được hành vi INNER JOIN.



  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 đường dẫn của các danh mục được lưu trữ trong MySQL

  2. Amazon RDS Aurora so với RDS MySQL và MySQL trên EC2?

  3. lỗi trong cú pháp SQL của bạn .. gần 'key'

  4. Tôi có thể khôi phục một bảng từ tệp mysql mysqldump đầy đủ không?

  5. tạo trình kích hoạt trên các cơ sở dữ liệu khác nhau