Oracle-10g

給定查詢之間的差異

  • August 21, 2013

我需要檢索pno兩個客戶購買的產品的 ( product_id ) 列表。為此,我得到了兩個關係(連同屬性)如下。

odetails(ono,pno,qty)
orders(ono,cno,eno,received,shipped) 

這裡ono是 order_id,pno是 product_id,qty是庫存產品的數量,cno是購買產品的客戶的 customer_id,eno是銷售產品的 employee_id,是received客戶收到產品的日期和shipped是產品的發貨日期。ono是 的主鍵orders和外鍵odetailsono, pno,qty構成 的主鍵odetails

一個查詢是:-

select distinct d.pno 
from odetails d,orders o1,orders o1 
where d.ono=o1.ono 
 and d.ono=o2.ono 
 and o1.cno<o2.cno;

另一個查詢是:

select distinct d1.pno 
from odetails d1,odetails d2,orders o1,orders o1 
where d1.ono=d2.ono 
 and d1.ono=o1.ono 
 and d2.ono=o2.ono and o1.cno<o2.cno;

你能告訴我這兩個查詢有什麼區別嗎?它們似乎都以相同的方式工作,除了第二個查詢似乎正在做額外的和無用的工作來比較兩者odetails,而他們甚至不需要這樣做。

考慮以下odetails數據:

ono   pno
---------
1     1
1     2

如果你自己加入它ono,比如

SELECT pno
FROM odetails d1 JOIN odetails d2 ON d1.ono = d2.ono;

那麼你將得到四行而不是兩行。因此,即使返回相同的數據,這兩個查詢的含義也不同(感謝DISTINCT關鍵字)。

(兩次加入orders表可能會出現類似問題。由於您沒有提及此查詢的確切要求,因此無法確定第一個查詢是否正確。(感謝 ypercube 提及這一點。))

引用自:https://dba.stackexchange.com/questions/48478