[英]Oracle SQL query about only extracting certain items
所以我有這三個表:
WORKERS( WNO, WNAME, ZIP, HDATE )
CUSTOMERS( CNO, CNAME, STREET, ZIP, PHONE )
ORDERS( ONO, CNO, WNO, RECEIVED, SHIPPED )
我想找到只向與他們居住在相同郵政編碼中的客戶進行銷售的工人。 到目前為止,我有以下代碼:
SELECT e.wno
FROM ORDERS o, CUSTOMERS c, WORKERS e
WHERE o.cno = c.cno AND o.wno = e.wno AND c.zip = e.zip
但這沒有給出所需的答案。 誰能幫我這個? 如果您可以幫助,那就太好了。
ONO CNO WNO RECEIVED SHIPPED CNO CNAME STREET ZIP PHONE WNO WNAME ZIP HDATE
1021 1111 1000 12-JAN-95 15-JAN-95 1111 Charles 123 Main St. 67226 316-636-5555 1000 Jones 67226 12-DEC-95
1020 1111 1000 10-DEC-94 12-DEC-94 1111 Charles 123 Main St. 67226 316-636-5555 1000 Jones 67226 12-DEC-95
1022 2222 1001 13-FEB-95 20-FEB-95 2222 Bertram 237 Ash Avenue 67226 316-689-5555 1001 Smith 60606 01-JAN-92
1026 2222 1001 03-JAN-96 08-JAN-96 2222 Bertram 237 Ash Avenue 67226 316-689-5555 1001 Smith 60606 01-JAN-92
1023 3333 1000 20-JUN-97 3333 Barbara 111 Inwood St. 60606 316-111-1234 1000 Jones 67226 12-DEC-95
1024 4444 1002 13-APR-95 17-APR-95 4444 Jorge 131 State St. 47907 765-111-1884 1002 Brown 50302 01-SEP-94
1025 4444 1000 25-APR-95 30-APR-95 4444 Jorge 131 State St. 47907 765-111-1884 1000 Jones 67226 12-DEC-95
嘗試這個:
SELECT e.wno
FROM ORDERS o join CUSTOMERS c on o.cno = c.cno
join WORKERS e on o.wno = e.wno
Group by e.wno,c.zip
having count(*)=1
我認為您的原始查詢僅需添加NOT EXISTS
子句即可使用:
SELECT e.wno
FROM workers e, orders o, customers c
WHERE e.wno = o.wno
AND o.cno = c.cno
AND c.zip = e.zip
AND NOT EXISTS ( SELECT 1 FROM orders o1, customers c1
WHERE o1.wno = e.wno
AND o1.cno = c1.cno
AND c1.zip != e.zip );
也就是說,讓所有以自己的郵政編碼交付給客戶但未在郵政編碼之外交付工人。 您可能還希望使用ANSI連接(我必須承認我對這種語法不太滿意,所以我不能100%地確定連接正確):
SELECT e.wno
FROM workers e INNER JOIN orders o
ON e.wno = o.wno
INNER JOIN customers c
ON o.cno = c.cno
WHERE c.zip = e.zip
AND NOT EXISTS ( SELECT 1 FROM orders o1 INNER JOIN customers c1
ON o1.cno = c1.cno
WHERE o1.wno = e.wno
AND c1.zip != e.zip );
一種方法是找到所有在不同郵編上出售產品的工人,然后再減去(或不輸入)。
SELECT e.wno
FROM WORKERS e
WHERE e.wno NOT IN (
SELECT e.wno
FROM ORDERS o, CUSTOMERS c, WORKERS e
WHERE o.cno = c.cno AND o.wno = e.wno AND c.zip != e.zip)
可能在下面的查詢將幫助您:)
select * from WORKERS WR,CUSTOMERS CR,ORDERS OR
where
WR.ZIP=OR.ZIP
AND CR.CNO=OR.CNO
AND WR.WNO=OR.WNO
AND OR.RECEIVED is not null;
“ OR.RECEIVED不為空”是確保客戶已收到他/她的物品的條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.