Kiểm tra id trong 1 table có liên tục không?

như tít , em đang làm bài tập sql có 1 câu như vậy , tìm trên mạng thì có 1 câu querry thực thi ra kết quả đúng nhưng em ko hiểu vì sao nó đúng @@

select 'Y' from docgia having count(*) = max(ma_docgia)

với ma_docgia là id trong table docgia , khi id liên tuc thì câu trên trả về Y

và 1 yêu cầu nữa là nếu id không liên tục thì tìm STT trống nhỏ nhất

select min(ma_docgia+1)
from docgia
where (ma_docgia+1) not in (select ma_docgia from docgia)

câu này sẽ cho ra đúng yêu cầu

em không hiểu ở câu querry đầu sao lại là select 'Y'having count(*)
câu querry sau sao lại để min(ma_docgia+1) ở chỗ select , vì select là muốn lấy ra cột nào để đây làm gì

Chịu suy nghĩ tí là ra thôi.

Đang suy nghĩ...

Dòng lệnh 1

1 2 3 4

max = 4, count = 4. count = max => Liên tục.

1 3 4

max = 4, count = 3. count < max => Không liên tục.

count > max

Không có trường hợp count > max. Vì ma_docgia (ID) thường là khóa chính (không trùng nhau).

1
2
2 Trùng
3
4
4 Trùng

max = 4, count = 6 => Không xảy ra.

Cũng còn tùy việc ma_docgia tăng từ đâu (mặc định là 1) mà ta thực hiện phép so sánh cụ thể theo nó.

Dòng lệnh 2

Giả sử ta có bảng docgia như sau:

ma_docgia ten_docgia
1 Nguyen Van A
3 Lo Thi C
4 Truong Van D
7 Tran Van G

Chạy từng lệnh riêng thử xem.

select ma_docgia from docgia

Kết quả (1):

ma_docgia
1
3
4
7
select ma_docgia+1 from docgia

Kết quả (2):

ma_docgia
2
4
5
8

Rồi xét 2 bảng sao cho (where) bảng (2) không có trong (not in) bảng (1).

select ma_docgia+1 from docgia where (ma_docgia+1) not in (select ma_docgia from docgia)

Kết quả (3):

ma_docgia
2
5
8

Cuối cùng là chọn giá trị nhỏ nhất (min) của bảng (3).

select min(ma_docgia+1) from docgia where (ma_docgia+1) not in (select ma_docgia from docgia)

Kết quả:

2
5 Likes

Một ví dụ nữa:

select sum(DonGia*SoLuong)
from ChiTietHoaDon join HoaDon on ChiTietHoaDon.MaHoaDon = HoaDon.MaHoaDon
where Ngay < '2019-11-01' and Ngay >= '2019-10-01'

madocgia+1 ở trên cũng là một cột.

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