2012-10-09 39 views
1

我有2個sql查詢返回不同的結果。 這兩個查詢都使用相同的連接操作,但對IN子句內的連接參數具有不同的綁定。來自內部的SQL影響連接結果

第一個,我直接參考join參數。我第二次使用免費的上下文查詢時使用了 。 我得到不同的結果,我想明白爲什麼。

-- this one returns 13 tuples 
select c.companyname 
    from companies as c 
    join stocklist as s 
    using (companyid) 
    where s.price in((select MAX(s.price)),(select MIN(s.price))); 




--this one returns two tuples. as it should 
select companyname 
    from companies join stockslist 
    using (companyid) 
    where price in(
    (select max(price) from stockslist),(select min(price) from stockslist) 
    ); 

回答

3

你能想到的s作爲命名實例stockslist。這不完全正確,但有助於這樣想。

當您在內部查詢的外部查詢中使用命名錶時,它會使用該特定行的值爲外部表的每一行執行內部查詢。

你頂的查詢基本上等同於:

-- this one returns 13 tuples 
select c.companyname 
    from companies as c 
    join stocklist as s 
    using (companyid) 
    where s.price in(s.price,s.price) 
+0

+1。在技​​術術語中,第一個查詢具有*相關*子查詢(因爲它們與來自外部查詢的當前記錄「相關聯」),而第二個查詢具有*不相關*子查詢(因爲它們根本不參考到其他查詢中的任何內容)。 – ruakh

+0

+1我不知道,謝謝:) – MimiEAM