
có cách nào để xóa cái cùng id product mà số lượng (amount ) nhỏ hơn ko ạ.

có cách nào để xóa cái cùng id product mà số lượng (amount ) nhỏ hơn ko ạ.
Thử dùng câu sql này.
DELETE FROM table_A WHERE product_id=1 order by amount limit 1
ths ạ . . …
cái này nếu product đó chỉ có 1 record thì nó cũng xoá luôn.
Đồng ý với bạn,
cần phải có 1 câu sql để kiểm tra xem procut_id có số dòng lớn hơn hoặc bằng 2 thì mới tiến hành hình xóa.
do câu hỏi chỉ nói xóa thôi nên chỉ cho câu sql để xóa.
cái này cần có thêm nghiệp vụ vào(business logic) thì mới biết cách xử lý trước đó như thế nào.
Thử xem nhé:
1. Đầu tiên tìm những dòng bị dulicate product_id
select product_id, max(amount) MAX_Amount
from table_a
group by product_id
having count(*) > 1
2. Giờ tìm những dòng bị duplidate, mà có AMOUNT nhỏ hơn Max_AMOUNT.
select ID
from table_a A,
(select product_id, max(amount) MAX_Amount
from table_a
group by product_id
having count(*) > 1
) B
where A.product_ID=B.Product_ID
and A.Amount < B.MAX_Amount
3. Sau khi có những dòng cần tìm, giờ gán nó vào câu DELETE
DELETE FROM table_A
where ID in
( _câu query ở trên_ )
=> Lưu ý là với cách làm trên, những rows cùng product_id, và cùng max_amount vẫn ko bị xóa !
cái 2 dùng subquery có vẻ chậm đó bạn 
Ko phải cứ subquery là chậm, đó là quan niệm sai lầm của người mới học sql (thấy viết câu sql dài => chậm).
Bản chất khi query từ VIEW đã là subquery, hay như (2) có thể xem là in-line view.
Muốn biết chậm hay ko ngoài việc đánh giá chủ quan quá trình xử lý của câu lệnh trong từng trường hợp (vd: join trước, hay filter trước là có lợi hơn?), ngoài ra con phải xem execution plan để biết câu lệnh sẽ được chạy như thế nào, indexes nào được dùng, indexes nào bị missed,…
Riêng với câu correlated subquery thì phải cẩn thận hơn, mặc dù một số csdl lớn như Oracle có khả năng rewrite lại bad/stupid sql.
Thanks bạn mod nào đã giúp format lại bài post trên.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?