Yêu cầu May 14th, 2024 8:39 a.m. 379 0 5
  • 379 0 5
0

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

Chia sẻ
  • 379 0 5

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
May 17th, 2024 2:17 a.m.

5 CÂU TRẢ LỜI


Đã trả lời May 14th, 2024 9:09 a.m.
+2

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.

Chia sẻ
Avatar Win @D7new
May 14th, 2024 9:34 a.m.

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

Đã trả lời May 14th, 2024 9:03 a.m.
+1

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

Chia sẻ
Avatar Win @D7new
May 14th, 2024 9:34 a.m.

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

Avatar Win @D7new
May 14th, 2024 11:08 a.m.

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

Avatar Win @D7new
May 15th, 2024 2:12 a.m.

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

Đã trả lời May 21st, 2024 9:33 a.m.
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ử

Chia sẻ
May 25th, 2024 5:12 a.m.

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;

Đã trả lời May 29th, 2024 10:23 a.m.
0

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

Chia sẻ
Đã trả lời Oct 3rd, 2024 9:40 a.m.
-1

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 )

Chia sẻ
Avatar Long @boylong03
Jan 6th, 2025 3:54 a.m.

nhìn mấy thánh lú hết cả đầu

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí