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 :smile: 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 đỡ.

2 Likes

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

1 Like

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.

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

.

1 Like

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.

1 Like

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 :cry:. hi

1 Like

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 :frowning: Thanks

Để 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.

Đó bạn, thanks trước :smile:

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é :smile: . Nếu đúng thì mới tính câu 46. Vì gần tương tự.

2 Likes

Ok rồi đó bạn :smile:

1 Like

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

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

1 Like

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

1 Like

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.

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.

1 Like

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
                 )

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
1 Like

Đâ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.

1 Like

a ơi cho e xin file đáp án của bài này với, e làm đến câu 45 là tịt luôn rồi :((

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?