2013-02-25 78 views
2

我想知道這兩個版本是否在結果上是等價的,哪個更適合性能方面的原因,爲什麼? 嵌套選擇在選擇版本sql查詢區別

select 
t1.c1, 
t1.c2, 
(select Count(t2.c1) from t2 where t2.id = t1.id) as count_t 
from 
t1 

VS

select t1.c1,t1.c2, Count(t2.c1) 
from t1,t2 
where t2.id= t1.id 

回答

4

第一個查詢是該查詢的模擬 -

SELECT 
    t1.c1, 
    t1.c2, 
    COUNT(t2.c1) 
FROM t1 
    LEFT JOIN t2 
    ON t2.id = t1.id; 

它選擇從第一表中的所有記錄,並從第二表中的所有匹配的記錄(它是LEFT JOIN條件)。

第二是該查詢的模擬 -

SELECT 
    t1.c1, 
    t1.c2, 
    COUNT(t2.c1) 
FROM t1 
    JOIN t2 
    ON t2.id = t1.id; 

它選擇兩個表中只有匹配的記錄(它是INNER JOIN條件)。

+0

」第一個查詢是此查詢的類比......「是的,但只有't2(id)'是主鍵或唯一。 – 2013-02-25 09:17:13

+0

@Devart:只是爲了澄清一些事情,我的第一個查詢'count(t2.c1)'在t1.id'和't2.id'之間存在匹配的時候,在你的暗示中這個工作當且僅當'Count'函數不計算'nulls',我說得對嗎? – JavaSa 2013-02-25 10:19:36

2

那麼,他們是不同的查詢。如果在表t2中沒有匹配的id,那麼最上面的那個將選擇t1中所有的行,返回0作爲計數。

第二個查詢將只返回其中t1和t2都具有相同ID的行的行。

0

第一個查詢可能會遇到大數據集上的性能問題。第二個查詢可能會有笛卡兒問題。如果表2沒有相關記錄,然後添加一個按語句組來控制笛卡兒,我會根據您的意圖從表1中獲取記錄,然後進行連接或左連接。 「