2013-05-01 74 views
1

我以爲我用以下兩個查詢獲得相同的結果,但當我嘗試時得到了不同的結果,有誰可以請解釋除了聯接和子查詢之外有什麼區別。 從tbl_1這兩個查詢有什麼區別可以任何人解釋

select * from tbl_1 where t1id in (select t2id from tbl_2); 

select t1.* from tbl_1 t1, tbl_2 t2 where t1.t1id = t2.t2id; 

編輯在這裏t1id被主列和T2ID被引用的列:當我想我有93條記錄爲第一個查詢和74第二個查詢,我略微改變了第一查詢關鍵詞,比如:

select * from tbl_1 where t1id in (select distinct t2id from tbl_2); 

然後我得到了40行。任何人都可以解釋發生了什麼。

預先感謝

+0

當您比較兩個時,'EXPLAIN'會說些什麼?第二個查詢是'JOIN'的一種形式,其中第一個是直接子查詢。 – tadman 2013-05-01 06:43:35

回答

4

第一個查詢選擇來自第一表具有在所述第二表中的id所有行。

第二個查詢從第一個表中選擇所有行,對於每個行,第二個表中的所有行都選中。然後過濾掉id不匹配的行。

如果id在第二個表中不唯一,則第二個查詢可以返回比第一個更多的行。

+0

但相反,我有第一個查詢93記錄和第二個查詢74記錄,我不明白登錄爲什麼這麼..! – Chella 2013-05-01 07:42:33

+0

請現在看看我編輯的問題,然後回答請 – Chella 2013-05-01 07:45:17

+0

Ho man ..!在第二個ID不應該是唯一的我認爲(因爲它是外鍵,它不是我的情況下的一對一關係) – Chella 2013-05-01 07:47:30

1

它們都試圖做同樣的事情:如果tbl_2獲得tbl_1中的id值可以在t2id列中找到的所有行,儘管如果找到id,第二個將從tbl_1多次返回相同的行在tbl_2中多次(不是特別有用)。

但是這兩個查詢不如這一個,這也確實理智的事情,只是MUCHO有效地重複:

select distinct t1.* 
from tbl_1 t1 
join tbl_2 t2 on t1.t1id = t2.t2id; 
+0

@a_horse_with_no_name是的。現在怎麼樣? – Bohemian 2013-05-01 07:32:21

+0

請看看我編輯的問題,我已經告訴我,我認爲它達到了相同,但我得到了不同的結果。U再次傳達了相同的結果 – Chella 2013-05-01 07:45:51

+0

爲什麼你認爲獨特的操作是有效的?根據我的經驗,它們非常昂貴。 – Andomar 2013-05-01 07:53:29

1

原因「中」和「參加」查詢之間的錯配是: -

TBL1 ID名稱 1 ABC

tbl2的 ID名稱 1 ABC 1 ABC

now,select * from tbl1 where id in(select from tb12) 儘管表2中存在2個id值,即1,但只有一行是從tbl1中取出的。 你可以嘗試執行上述查詢作爲 select * from tbl1 where id in(1,1) - >它將只給出1行 這是因爲「In返回true,如果指定的值匹配子查詢中的任何值或一個列表「

第二,innerjoin查詢將導致2行,因爲tbl1中的id與tbl2表中的2行匹配。

相關問題