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.