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ý