30/09/2018, 16:20

Cần giúp đỡ viết câu truy vấn SQL dùng kết ngoài

Đây là đề bài mình đang làm, vì đề khá dài nên mình gửi trong file này https://www.mediafire.com/?gbooot9o4pinn7g
Đây là các câu truy vấn để tạo bảng: https://www.mediafire.com/?etj1e9nd2102wcr

Mình suy nghĩ mãi vẫn chưa làm ra câu 45, 46. Ai có kinh nghiệm viết câu truy vấn SQL này rồi có thể giúp mình với. Thanks Còn 1 số câu ở dưới cũng có liên hệ từ câu 45 này nhưng vẫn chưa tìm ra phương án cho nó nên vẫn chưa làm tiếp được. Mong mọi người giúp đỡ.

X viết 18:27 ngày 30/09/2018

k ai giúp đâu bạn =))) post câu hỏi gì kỳ vậy

Oliver viết 18:36 ngày 30/09/2018

Chứ post câu hỏi ra sao, tại câu đó dài lắm, với phải có cái đề mới hiểu câu hỏi nên mình ghi vắn tắt vậy thôi.

Phạm Hoàng Tuấn viết 18:23 ngày 30/09/2018

Công nhận 2 câu này cũng hơi hóc. Mình đưa ra gợi ý như vậy:

Câu 45 : Ý tưởng chung là với từng loại máy bay (group by loại máy bay) đếm số nhân viên trong bảng NHANVIEN mà mã nhân viên không tồn tại (not exists) trong danh sách mã nhân viên có thể lái đó máy bay đó lấy trong bảng CHUNGNHAN

Câu 46 : Ý tưởng chung là với từng loại máy bay (group by loại máy bay) đếm số nhân viên trong bảng CHUNGNHAN viên mà mã nhân viên không tồn tại (not exists) trong danh sách mã nhân viên có thể lái đó máy bay đó lấy trong bảng CHUNGNHAN

.

Nguyễn Minh Dũng viết 18:26 ngày 30/09/2018

Bạn @david15894 cũng có ý đúng đấy, mình nên copy cái đề ra để cho người khác có thể đọc và hiểu ngay vấn đề. Nhưng cái đề của @gialoui dài quá thì có thể để link. Để tốt nhất thì mình nên giải thích vì đề quá dài nên mình để cái đề trong link này: …

@tuancoi2506 có thể gợi ý sửa lại title của câu hỏi này không

Cần giúp đỡ viết câu truy vấn SQL

Đây không phải là một tiêu đề hay, nó không thể hiện được nội dung câu hỏi.

Phạm Hoàng Tuấn viết 18:33 ngày 30/09/2018

Cũng hơi khó a, vì thật ra câu hỏi này k post lên hết thì khó giúp giải quyết dc vấn đề lắm a. Cái title có thể sửa thành ‘Truy vấn SQL dùng kỹ thuật kết ngoài’ (theo hướng của đề bài). Vì có thể fai dùng kỹ thuật này.Lâu rồi,k nhớ cái này nữa . hi

Oliver viết 18:29 ngày 30/09/2018

Mình theo gợi ý mà vẫn chưa viết được, bạn có thể ghi ra luôn câu truy vấn đó được không Thanks

Phạm Hoàng Tuấn viết 18:34 ngày 30/09/2018

Để mình thử, mà giờ đang hơi bận tý, bạn upload file script có data lên mediafire đi, tối về mình tải xuống mình làm thử xem.

Oliver viết 18:20 ngày 30/09/2018
MediaFire

CsdlHangkhong.sql

MediaFire is a simple to use free service that lets you put all your photos, documents, music, and video in a single place so you can access them anywhere and share them everywhere.

Đó bạn, thanks trước

Phạm Hoàng Tuấn viết 18:23 ngày 30/09/2018

Câu 45 :

select  mb.Loai,count (nv.MaNV) as SLNhanVien
from MAYBAY mb , NHANVIEN nv
where not exists	(
    select *
    from MAYBAY mb2, CHUNGNHAN cn
    where mb2.Loai=mb.Loai and mb2.MaMB=cn.MaMB and cn.MaNV=nv.MaNV
)
group by mb.Loai


select  mb.Loai,count (cn.MaNV) as SLNhanVien
from MAYBAY mb , CHUNGNHAN cn
where not exists	(
    select *
    from MAYBAY mb2, CHUNGNHAN cn2
    where mb2.Loai=mb.Loai and mb2.MaMB=cn2.MaMB and cn.MaNV=cn2.MaNV
)
group by mb.Loai

Bạn test thử xem đúng chưa nhé . Nếu đúng thì mới tính câu 46. Vì gần tương tự.

Oliver viết 18:25 ngày 30/09/2018

Ok rồi đó bạn

Oliver viết 18:31 ngày 30/09/2018

@tuancoi2506: Bạn xem giúp mình câu 58 luôn với Thanks

Phạm Hoàng Tuấn viết 18:34 ngày 30/09/2018

uhm, để tối về mình xem thử. hi

Nhỏ viết 18:29 ngày 30/09/2018

Sao bạn không thử tự làm nhỉ?
Câu 58:

Nguyễn Minh Dũng viết 18:26 ngày 30/09/2018

Cảm ơn @hainho về câu 58 nhé, nhưng mình có thể viết thẳng SQL query lên và dùng markdown để đánh dấu query như bài trên của @tuancoi2506.

Tuy không đẹp bằng tool xịn nhưng mình có thể copy được.

Oliver viết 18:35 ngày 30/09/2018

Hình như của bạn bị sai rồi, mình đưa vào nó liệt kệ ra hết đúng 12 tên của phi công, trong khi đó trong bảng MAYBAY có 1 chiếc có tầm bay dưới 3200.

Phạm Hoàng Tuấn viết 18:28 ngày 30/09/2018

Bạn thử bài này xem

select distinct nv.Ten
from NHANVIEN nv
where not exists ( select *
                   from  CHUNGNHAN cn, MAYBAY mb
	           where cn.MaMB=mb.MaMB and cn.MaNV=nv.MaNV and mb.TamBay <=3200
                 )
phanminhphat viết 18:25 ngày 30/09/2018

Chao ban! hehe, minh nghi cau 46 hình như bị dư, do bị lặp số người phi công, mình có thêm 1 đoạn, hehe, mình nghĩ nó sẽ hoàn thiện hơn
select MB.Loai,count (*) as SLPC
from MAYBAY as MB , NHANVIEN as NV
where not exists (
select *
from MAYBAY as MB_2, CHUNGNHAN CN_2
where MB_2.Loai= MB.Loai and MB_2.MaMB = CN_2.MaMB and NV.MaNV= CN_2.MaNV
) and NV.MaNV in (
select CHUNGNHAN.MaNV
from CHUNGNHAN
where CHUNGNHAN.MaNV = NV.MaNV
)
group by MB.Loai

Khánh Hưng Nguyễn viết 18:31 ngày 30/09/2018

Đây là một cách làm khác cho câu 45 (46 tương tư).
Mình không dùng NOT EXIST vì cách làm CROSS JOIN khiến execution plan không tối ưu.
Xem cụ thể tại STATISTICS ON để biết thêm nhé.
À, một điều nữa. Các bạn làm SQL muốn làm dự án lớn thì đầu tư vào SQL Prompt thật kỹ nhé. Nếu không thì thật khó để debug với những CSDL hàng ngàn tables cũng như store procedures.

SET STATISTICS IO ON 

DECLARE @I	INT

SET	@I	= (SELECT COUNT(MaNV) FROM NHANVIEN)

SELECT	        ISNULL(MAYBAY.MaMB,' ')		AS	MAMAYBAY
	,       (@I - COUNT(CHUNGNHAN.MaNV))    AS	SONHANVIEN
			
FROM		MAYBAY

LEFT JOIN	CHUNGNHAN 
       ON       MAYBAY.MaMB	=    CHUNGNHAN.MaMB

GROUP  BY	MAYBAY.MaMB

SET STATISTICS IO OFF

--------------------------------------------STATISTICS RESULT--------------------------------------------
Table ‘NHANVIEN’. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘CHUNGNHAN’. Scan count 10, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table ‘MAYBAY’. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

==> Khoảng 44 Logical Reads.

Bài liên quan
0