Hiển thị kết quả từ 1 đến 8 / 8
-
31-07-2012 21:52 #1
Registered User
- Tham gia
- 31-07-2012
- Bài viết
- 5
- Like
- 0
- Thanked 0 Times in 0 Posts
Mong mọi người giúp đỡ mình câu truy vấn này !!!
Cơ sở dữ liệu mình gồm 4 bảng
LOPHOC (MALOP, SISO ,LOPTRUONG, GVQUANLY, NAMBD, NAMKT)
HOCVIEN (MAHV, TENHV, NGAYSINH, TINHTRANG, MALOP)
KETQUA (MAHV, MAMH, LANTHI, DIEM)
MONHOC(MAMH, TENMH, SOTINCHI)
Y/c như sau
Liệt kê các sinh viên có điểm trung bình cao nhất theo từng lớp học. Thông tin gồm : MaLop,TenHV,DiemTB.
Điểm trung bình được tính trên điểm thi lần thi sau cùng của học viên theo công thức:
Điểm trung bình = Σ(Điểm * Số tín chỉ) / ΣSố tín chỉ
Mình là thành viên mới, mong mọi người bỏ chút thời gian giúp mình hoặc gợi ý cho mình ý tưởng cũng được, nhưng đừng sử dụng create view cho bài này. Mình rất cảm ơn sự giúp đỡ của mọi người.
-
01-08-2012 22:54 #2
Registered User
- Tham gia
- 30-06-2010
- Bài viết
- 190
- Like
- 4
- Thanked 23 Times in 20 Posts
Ít nhất cũng cố viết vài câu query cho mọi người xem chứ bạn, đừng quăng cả câu lên trống không như thế, mình nói thẳng bạn đừng trách
-
02-08-2012 12:03 #3
Registered User
- Tham gia
- 31-07-2012
- Bài viết
- 5
- Like
- 0
- Thanked 0 Times in 0 Posts
Do mình chưa post đủ 50 bài nên diễn đàn ko cho post link. Mình viết cách khoảng các dấu chấm
Câu query của mình như sau
Nhưng phải liệt kê ra 1 bảng LopDTB điểm trung bình của các học viên, rồi sau đó mới thực hiện lọc ra học viên cao nhất, nếu không dùng view thì phải lặp lại phần lọc LopDTB trong đoạn select lấy ra học viên cao nhất, như vậy querry sẽ rất dài, nếu như viết trong Stored Procedure thì mỗi lần chỉnh sửa stored procedure thì phải drop view LopDTB, mình thấy như vậy hơi rắc rối. Bạn nào có cách truy vấn khác giải quyến vấn đề này, xin hãy chia sẻ giúp mình. Mình cảm ơn rất nhiều!Code:create view LopDTB as select hv. MaLop, hv. MaHV, hv. TenHV, hv1. DTB from HocVien hv inner join (select kq. MaHV, sum(kq. Diem*kq. SoChi) / sum(SoChi) DTB from (select kq. MaHV, kq. MaMH, kq. LanThi, kq. Diem, mh. SoChi from KetQua kq inner join MonHoc mh on kq. MaMH = mh. MaMH inner join (select kq. MaHV,kq. MaMH,LanThi = Max(kq. LanThi) from KetQua kq group by kq. MaHV,kq. MaMH) tempKQ on kq. MaHV=tempKQ. MaHV and kq. MaMH=tempKQ. MaMH and kq. LanThi = tempKQ. LanThi) kq group by kq. MaHV) hv1 on hv. MaHV=hv1. MaHV select l. MaLop, l. MaHV, l. TenHV, l. DTB from LopDTB l where Not Exists (select lt. MaLop, lt. DTB from LopDTB lt where lt. MaLop = l. MaLop and lt. DTB > l. DTB)Được sửa bởi ng_hung_381 lúc 12:09 ngày 02-08-2012 Reason: bổ sung
-
02-08-2012 15:36 #4
Registered User
- Tham gia
- 30-06-2010
- Bài viết
- 190
- Like
- 4
- Thanked 23 Times in 20 Posts
Mình thấy về cách làm thì bạn tuơng đối đã nắm rõ, nên mình không nói nhiều về query nữa, chỉ góp y bạn 1 số điều sau.
Query dài không quan trọng, quan trọng là phải dài 1 cách hợp lý, dễ hiểu(điều này rất cần khi làm chung) và có performance tốt.
Không dùng view thì dùng bảng tạm cũng chẳng có vấn đề gì cả. Mục tiêu cuối cùng là chính xác và tốc độ, dể chỉnh sửa, dễ debug lỗi.
Bạn hãy dùng bảng tạm đi, đầu SP drop nó, đại loại như thế này :
Code:if object_id('tempdb..#ketqua') is not null drop table #ketqua
-
02-08-2012 20:14 #5
Registered User
- Tham gia
- 31-07-2012
- Bài viết
- 5
- Like
- 0
- Thanked 0 Times in 0 Posts
cám ơn bạn hoangnnm đã góp ý những lời khuyên hữu ích. Nhưng mà tại vì mình có nhớ đọc ở đâu đó ưu điểm của SP là giúp cho quá trình xử lý nhanh hơn, nhờ nó không phải thông qua biên dịch, kiểm tra nữa mà thực thi luôn querry, nhưng ở đây mỗi lần thực thi store thì phải drop rồi create vậy đâu có khác nào biên dịch lại view, cho nên store không có tác dụng xử lý nhanh nữa. Mình cũng chỉ mới biết 1 chút về SQL, có nói sai gì mọi người đừng cười mà hãy bổ sung giúp mình, hì
-
02-08-2012 21:27 #6
Registered User
- Tham gia
- 30-06-2010
- Bài viết
- 190
- Like
- 4
- Thanked 23 Times in 20 Posts
Thực tế qua quá trình làm việc thực tế bạn sẽ nhận thấy cái chuyện biên dịch đó nó rất là nhỏ nhặt, tốc độ thực sự phụ thuộc vào cách viết query, độ lớn/cấu trúc của dữ liệu, database lớn cỡ hàng trăm triệu trở lên mình chưa làm nhưng vài triệu hoặc chục triệu thì mình đã từng làm rồi. Đây là đúc kết từ kinh nghiệm thực tế của mình
.
Theo ý kiến riêng của mình, thì View nên dùng ở trường hợp muốn thể hiện dữ liệu từ 1 hoặc nhiều bảng khác nhau, ví dụ như view tra về danh sách sinh viên, họ tên, lớp, các môn học tham gia.
Và bạn không nên tạo view trong 1 SP, bạn hãy xem view như là 1 table cố định chứ không phải là 1 thứ gì đó mang tính tạm thời.
Trong SP bạn chỉ nên tham chiếu đến View, nghĩa là chỉ select from VIEW để lấy thông tin.
Bởi vậy mình mới đưa ra ý kiến là bạn nên dùng bảng tạm
-
03-08-2012 08:17 #7
Theo như thiết kế này, bạn chỉ cần tạo một view tính điểm trung bình cho từng học viên.
SP của bạn muốn làm gì thì làm, chỉnh sửa gì cũng được. Nó querries view này khi cần đến biểm trung bình của học viên.
Cái lợi của view là bạn có thể index nó nếu cần.
Nếu điểm trung bình không còn dùng ở nơi nào khác nữa thì tạo một view riêng cho một trường hợp cũng hơi thừa. Trong môi trường MS SQL Server 2005+, bạn có thể dùng Common Table Expression (nếu sp chỉ có một querry chính) hoặc bảng tạm (nếu sp có nhiều querry).
-
03-08-2012 21:02 #8
Registered User
- Tham gia
- 31-07-2012
- Bài viết
- 5
- Like
- 0
- Thanked 0 Times in 0 Posts
thank mọi người đã giúp đỡ
)


Quote

Bookmarks