Hỏi về câu truy vấn CSDL SQL Server

Liên hệ QC

nqn_vnn

Thành viên mới
Tham gia
27/9/09
Bài viết
23
Được thích
0
Em có bảng dữ liệu như sau:
NgayBan || MaHH || TenHH || SoLg || CuaHang


VD:
Record 1: 20/01/2010 || PS || Kem PS || 200 || HCM
Record 2: 22/01/2010 || PS || Kem PS || 150 || HCM
Record 3: 25/01/2010 || PS || Kem PS || 300 || HCM
Record 4: 15/01/2010 || SV || Sua Vina || 130 || HN
Record 5: 18/01/2010 || SV || Sua Vina || 200 || HN
Record 6: 19/01/2010 || KS || Keo Sig || 400 || HCM
Record 7: 23/01/2010 || KS || Keo Sig|| 180 || HCM


==> câu query sẽ lấy ra được Record 3, Record 5, Record 7
Em muốn lấy ra các record của mỗi MaHH ( Mã Hàng hóa - mã sẽ không trùng ) có NgayBan là mới nhất thì thế nào? Các anh chị giúp em với. Thanks mọi người.
 
Em có bảng dữ liệu như sau:
NgayBan || MaHH || TenHH || SoLg || CuaHang


VD:
Record 1: 20/01/2010 || PS || Kem PS || 200 || HCM
Record 2: 22/01/2010 || PS || Kem PS || 150 || HCM
Record 3: 25/01/2010 || PS || Kem PS || 300 || HCM
Record 4: 15/01/2010 || SV || Sua Vina || 130 || HN
Record 5: 18/01/2010 || SV || Sua Vina || 200 || HN
Record 6: 19/01/2010 || KS || Keo Sig || 400 || HCM
Record 7: 23/01/2010 || KS || Keo Sig|| 180 || HCM


==> câu query sẽ lấy ra được Record 3, Record 5, Record 7
Em muốn lấy ra các record của mỗi MaHH ( Mã Hàng hóa - mã sẽ không trùng ) có NgayBan là mới nhất thì thế nào? Các anh chị giúp em với. Thanks mọi người.
Dùng thử query sau:

Mã:
SELECT     dbo.tblHang.NgayBan, dbo.tblHang.MaHH, dbo.tblHang.TenHH, dbo.tblHang.SoLg, dbo.tblHang.CuaHang
FROM         dbo.tblHang INNER JOIN
                          (SELECT     MAX(DISTINCT NgayBan) AS NgayBan, MaHH
                            FROM          dbo.tblHang  
                            GROUP BY MaHH) AS a ON dbo.tblHang.NgayBan = a.NgayBan AND dbo.tblHang.MaHH = a.MaHH
 
[
Dùng thử query sau:

Mã:
SELECT     dbo.tblHang.NgayBan, dbo.tblHang.MaHH, dbo.tblHang.TenHH, dbo.tblHang.SoLg, dbo.tblHang.CuaHang
FROM         dbo.tblHang INNER JOIN
                          (SELECT     MAX(DISTINCT NgayBan) AS NgayBan, MaHH
                            FROM          dbo.tblHang
                            GROUP BY MaHH) AS a ON dbo.tblHang.NgayBan = a.NgayBan AND dbo.tblHang.MaHH = a.MaHH

xin anh cho biết chữ DISTINCT trong câu trên có tác dụng gì ?
 
Vì MAX/MIN là hàm tính tổng thể cho nên thực sự không cần cái chỗ DISTINCT. Có cũng được mà không thì không sao.
Cái từ khoá Distinct dùng trong AVERAGE và COUNT thì có thể ra kết quả khác.
Average của (1,2,3,4) khác với Average Distinct của (1,2,4,4)

Có một số trường hợp ngừoi ta cố tình dùng MAX/MN Distinct để nhắc nhở rằng cái Recordset này có thể có dữ liệu trùng; khi chyển qua AVERAGE/COUNT thì phải cẩn thận.
 
Tôi khong trả lời thẳng cho chủ thớt vì lý do cá nhân của tôi.

Bàn chung với các bạn thì bài này cũng có thể dùng câu truy vấn phụ loại Correlated (tự tương quan). Tuy nhiên, cũng cần nói trước rằng JOIN là trọng tâm của CSDL LH cho nên hầu hết các phần mềm CSDL đều đầu tư vào hiệu quả của lệnh JOIN. Suy ra trong hầu hết các trường hợp, JOIN sẽ nhanh hơn, nhất là khi có số dữ liệu lớn. Loại truy vấn Correlated chỉ chú trọng vào điểm dễ nhìn, dễ hiểu thôi (mà các điểm này cũng là tương đối và chủ quan)

Mã:
SELECT     Hang.NgayBan, Hang.MaHH, Hang.TenHH, Hang.SoLg, Hang.CuaHang
FROM         dbo.tblHang Hang WHERE Hang.NgayBan IN
                          (SELECT     MAX(DISTINCT NgayBan)  FROM  dbo.tblHang WHERE MaHH = Hang.MaHH)
 
Web KT
Back
Top Bottom