Asked May 14th, 8:39 a.m. 288 0 5
  • 288 0 5
0

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

Share
  • 288 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, 2:17 a.m.

5 ANSWERS


Answered May 14th, 9:03 a.m.
+1

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

Share
Avatar Win @D7new
May 14th, 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

0
| Reply
Share
Avatar Win @D7new
May 14th, 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

0
| Reply
Share
Avatar Win @D7new
May 15th, 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 😦(

0
| Reply
Share
Answered May 14th, 9:09 a.m.
+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
May 14th, 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

0
| Reply
Share
Answered May 21st, 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ử

Share
May 25th, 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;

0
| Reply
Share
Answered May 29th, 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

Share
Answered Oct 3rd, 9:40 a.m.
0

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 )

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