SQL, Join chỉ lấy một dòng dữ liệu
Xin chào!
- mình có 2 bảng dữ liệu tb_1, tb_2
- tb_2 cùng 1 pnlbarcode có 2 dòng dữ liệu khác nhau
- mình muốn hỏi cách JOIN tb_1 với tb_2 bằng pnl barcode, nhưng chỉ lấy 1 dòng dữ liệu có scan_dt lớn hơn ở tb_2
5 ANSWERS
Cảm ơn bạn ... để mình thử,,, với xem phương án nào hiệu năng cao hơn
Code này dùng được với db nhỏ, nhưng với db lớn không biết có tối ưu không
mình thấy có vấn đề là, nếu có nhiều dòng cùng scan_dt, thì sẽ JOIN tất cả. bài toán yêu cầu JOIN 1 dòng, và scan_dt lớn nhất (
bạn thử nha
SELECT
tb_1.*,
tb_2.*
FROM tb_1
LEFT JOIN (
SELECT pnlbarcode, MAX(scan_dt) AS max_scan_dt
FROM tb_2
GROUP BY pnlbarcode
) AS latest_tb_2
ON tb_1.pnlbarcode = latest_tb_2.pnlbarcode
LEFT JOIN tb_2 ON tb_2.pnlbarcode = latest_tb_2.pnlbarcode
AND tb_2.scan_dt = latest_tb_2.max_scan_dt
Oke thì cho mình xin 1 upvote 1 bookmark ở bài viết mới nhất nha. Thanks.
Cảm ơn bạn ... để mình thử,,, với xem phương án nào hiệu năng cao hơn
SELECT tb_1., tb_2. FROM tb_1 JOIN ( SELECT tb_2.* FROM tb_2 JOIN ( SELECT PNL_Barcode, MAX(scan_dt) AS max_scan_dt FROM tb_2 GROUP BY PNL_Barcode ) AS latest ON tb_2.PNL_Barcode = latest.PNL_Barcode AND tb_2.scan_dt = latest.max_scan_dt ) AS filtered_tb_2 ON tb_1.PNL_Barcode = filtered_tb_2.PNL_Barcode Bạn có thể thử
Cái đống comment bên dưới toàn các thánh viết sql 😆 , vấn đề này có thể giải quyết 1 cách đơn giản , mà sao cứ phải join , max, min làm cái méo gì :
SELECT TOP 1 * FROM ( SELECT T1.* ,T2.* FROM T1, T2 WHERE T1.PN=T2.PN ORDER BY T2.SCAN_DATE DESC )