簡體   English   中英

關於僅提取某些項目的Oracle SQL查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM