hỏi bài tập sql ?

database bán hàng này chắc ai cũng biết rồi, mình vẫn chưa " thông" được câu này :
Tìm các số hóa đơn đã mua cùng lúc
2 sản phẩm có mã số “SP01” và “SP02”
Viết bằng SQL:
SELECT SOHD FROM CTHD
WHERE MASP=’SP01’ AND SOHD IN
(SELECT SOHD FROM CTHD WHERE MASP=’SP02’)

tại sao tại WHERE đầu tiên không phải là MASP =‘SP01’ AND MASP =‘SP02’ luôn? bạn nào giải thích dùm mình càng chi tiết càng tốt nhá :dreaming:

Nếu dùng MASP =‘SP01’ AND MASP =‘SP02’ thì rõ ràng luôn trả về false rồi, giống như là if (x==1 && x ==2) vậy,
xét 2 câu lệnh riêng biệt này:
SELECT SOHD FROM CTHD WHERE MASP=’SP01’ => trả về những dòng mã hđ có mã sp = SP01;
SELECT SOHD FROM CTHD WHERE MASP=’SP02’ => trả về những dòng mã hđ có mã sp = SP02;

giả sử trả về 2 bảng sau


SOHD(SP01)                       SOHD(SP02)
     1                            1
     2                            3
     3                            5
     4                            6
     7                           

như vậy chỉ có Mã 1 và 3 là đạt yêu cầu có cả SP01 và SP02

nhìn vào 2 bảng có thể phát biểu câu dễ hiểu hơn: Chọn những mã xuất hiện Trong bảng 1 (SELECT SOHD FROM CTHD WHERE MASP=’SP01’) và (AND)
nó (SOHD) cũng phải xuất hiện trong (IN) bảng 2 (SELECT SOHD FROM CTHD WHERE MASP=’SP02’)

Bởi vì 1 sản phẩm chỉ có 1 MASP, bạn làm trực tiếp nghĩa là sản phẩm đó có đến 2 MASP lận => vô lý

thanks mấy anh :smiley: