Hiển thị kết quả từ 1 đến 8 / 8
  1. #1
    Tham gia
    31-07-2012
    Bài viết
    5
    Like
    0
    Thanked 0 Times in 0 Posts

    Thông tin 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.
    Quote Quote

  2. #2
    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

  3. #3
    Tham gia
    31-07-2012
    Bài viết
    5
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi hoangnnm View Post
    Í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
    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
    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)
    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!
    Được sửa bởi ng_hung_381 lúc 12:09 ngày 02-08-2012 Reason: bổ sung

  4. #4
    Tham gia
    30-06-2010
    Bài viết
    190
    Like
    4
    Thanked 23 Times in 20 Posts

    Thông tin

    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

  5. #5
    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ì

  6. #6
    Tham gia
    30-06-2010
    Bài viết
    190
    Like
    4
    Thanked 23 Times in 20 Posts

    Thông tin

    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

  7. #7
    Tham gia
    15-03-2010
    Bài viết
    1,119
    Like
    22
    Thanked 883 Times in 495 Posts
    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).

  8. #8
    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 đỡ )

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •