Asked thg 5 14, 8:39 SA 216 0 4
  • 216 0 4
0

SQL, Join chỉ lấy một dòng dữ liệu

Share
  • 216 0 4

image.png

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
thg 5 17, 2:17 SA

4 ANSWERS


Answered thg 5 14, 9:03 SA
+1

Như thế này được ko nhỉ :v image.png

Share
Avatar Win @D7new
thg 5 14, 9:34 SA

Cảm ơn bạn ... để mình thử,,, với xem phương án nào hiệu năng cao hơn

0
| Reply
Share
Avatar Win @D7new
thg 5 14, 11:08 SA

image.png 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

0
| Reply
Share
Avatar Win @D7new
thg 5 15, 2:12 SA

image.png

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 😦(

0
| Reply
Share
Answered thg 5 14, 9:09 SA
+1

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.

Share
Avatar Win @D7new
thg 5 14, 9:34 SA

Cảm ơn bạn ... để mình thử,,, với xem phương án nào hiệu năng cao hơn

0
| Reply
Share
Answered thg 5 21, 9:33 SA
0

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ử

Share
thg 5 25, 5:12 SA

Nếu SQL Server thì bạn dùng CTE cho đơn giản nhé 👍️

; WITH cte AS ( SELECT a.*, RN = ROW_NUMBER() OVER (PARTITION BY a.barcode ORDER BY a.scan_dt DESC) FROM @tb2 a LEFT JOIN @tb1 b on a.barcode = b.barcode ) SELECT * FROM cte WHERE RN = 1;

0
| Reply
Share
Answered thg 5 29, 10:23 SA
0

sắp xếp xong lấy top là là có dòng theo yêu cầu có đúng không

Share
Viblo
Let's register a Viblo Account to get more interesting posts.