2013-11-27 78 views
0

你好,我很困惑三個場景,通常每個人在幾乎每個項目中都使用它。SQL查詢效率(JOIN或笛卡爾乘積)

我想知道這其中的一個將高效accordinng到
- 更短的時間複雜度
- 效率
- 效益

表A(用戶ID,用戶名,電子郵件,電話)

表B (用戶名,TestField)

案例1

select email, TestField from TableA , TableB 
where TableA.username = TableB.username and 
TableB.username = 'ABC' 
group by email, TestField 

案例2

select email, TestField from TableA 
inner join TableB on TableB.username = 'ABC' 

案例3

declare @uname nvarchar(20); 
set @uname = 'ABC'; 
declare @Email nvarchar(20); 

select @Email= email from TableA where username = @uname; 

select @Email as email , TestField from TableB 
where username = @uname 
+0

在SQL Server上,您具有「顯示估計執行計劃」功能。它會告訴你查詢花了多長時間,並且還爲你提供了大量的簡潔信息。正如一個盲目的猜測:案例2應該是最有效和快速的。案例2只是建立用戶名'ABC'的JOIN。 – Bruellhusten

+0

如果我們想要讓整個數據與Joing條件相匹配,那麼哪一個會更有效? –

+1

A和B甚至不會產生相同的結果,那麼您認爲更有效的是什麼? – oerkelens

回答

1

案例2會給你一個不同的OU無論如何,因爲你沒有以任何方式加入TableA和TableB,所以你得到了笛卡兒的產品。

由於一下子email上來了,你需要的情況下,1聯接:

在案例1中,你可以查詢簡單地改寫爲

SELECT DISTINCT A.Email , B.TestField 
    FROM TableA A join TableB B on A.username = B.Username 
WHERE B.username = 'ABC' 

哪個更容易閱讀和因爲你沒有多餘的GROUP BY子句。

在案例3中,您的子句中有userId,根據您的帖子,您的tableB中甚至沒有

一般而言,可維護性和可讀性:

使用明確加入

SELECT * FROM A JOIN B ON A.id = B.id 

最好在

SELECT * FROM A, B WHERE A.id = B.id 

當你要重複值使用DISTINCT,而不是GROUP BY全部欄目:

SELECT DISTINCT a, b, b FROM TABLE 

最好在

SELECT a, b, c FROM TABLE GROUP BY a, b, c 
+0

由於最初的請求是針對表A的'email'和表B的'Testfield',因此無法按照您的建議重寫。 –

+0

事實上並非如此。這是用戶名。我現在看到了這些修改,它影響了我的答案。在_original_中沒有提及任何電子郵件和表格A沒有被使用過:) – oerkelens

0

大多數數據庫專家會告訴你,跨產品是邪惡的,要避免。你的第一個例子會工作得很好。這是一個隱式的內部聯接。

你的第二個例子在語法上是不正確的。我懷疑你會從MSSQL服務器管理器中得到一個錯誤。你大概的意思是:

select a.email, b.TestField 
from TableA a inner join TableB b 
    on (b.username = a.username) 
where b.username = 'ABC' 

你的第一個例子將可能是更有效的,因爲MSSQL Server是足夠聰明,做加盟之前做TableB.username的投影。我不那麼肯定,這將是案件2

以上版本的情況可以肯定,你可以做這樣的:

select a.email, b.TestField 
from TableA a inner join 
    (select * from TableB where TableB.username = 'ABC') b 
on (b.username = a.username) 
where b.username = 'ABC' 

希望有所幫助。