2010-04-15 61 views
1

我無法弄清楚這些查詢之間的區別。我很確定第一個是一個equi-join。我不確定第二個與第一個不一樣。 #2中的子查詢從S中選擇所有的Ids,然後它返回也有這些ID的所有R,不是?在哪裏和嵌套查詢之間的區別

SELECT R.cname FROM R,S, WHERE R.Id = S.Id

SELECT R.cname 從r WHERE R.Id IN(SELECT S.Id FROM S)

編輯:
我抓住這一關過去的考試....我引用:
雖然查詢好像產生他們不一樣的答案。他們如何 不同?您可以給出R和S的示例實例,這些實例顯示 這兩個查詢可以產生不同的答案。
R(身份證,TourId,CNAME,caddress,成本)
S(標識,規範ID)

編輯:編輯:
我猜它與重複做。

回答

1

假定這些數據:

R 

id cname 
-- -- 
1 RA 
1 RB 
2 RC 

S 
id cname 
-- -- 
1 SA 
1 SB 
2 SC 
2 SD 

,此查詢:

SELECT R.cname 
FROM R, S 
WHERE R.Id = S.Id 

返回

RA 
RA 
RB 
RB 
RC 
RC 

,而這一個:

SELECT R.cname 
FROM R 
WHERE R.Id IN 
     (
     SELECT S.Id 
     FROM S 
     ) 

返回

RA 
RB 
RC 

第一個查詢是兩個表的一個JOIN:對於每個匹配id它從兩個表

的秒查詢是一個表具有謂詞返回的記錄的所有可能的組合。它最多可以返回來自R的每條記錄一次。

1

從應用程序開發人員的角度來看,如果您有明確定義的表關係(尤其是連接查詢),則子查詢和連接查詢都可以爲您工作。但是,通常情況下,設備連接(或交叉連接哪個數據庫處理爲設備連接)可以更快,因爲數據庫可以優化連接查詢。但是在子查詢的情況下,數據庫必須獨立運行這兩個查詢,以便您可能會看到性能略有下降。話雖如此,如果故事中有太多數據並且子查詢可能適用於這種情況,那麼加入可能會變得緩慢。一般的經驗法則是儘可能使用連接。如果您看到一些問題,請嘗試子查詢。

2

IMO,都是糟糕的選擇,因爲它們是難以閱讀比:

Select R.Naem 
From R 
    Join S 
     On S.ID = R.ID 

超越的功能,在編寫代碼的首要目標應該是讓你的意圖明確爲其他讀者。開發人員必須閱讀第一個示例中的逗號,並知道這意味着交叉連接。第二,讀者必須確定你爲什麼寫了一個子查詢,而不是簡單地寫一個Join。是否有性能原因?結果有理由嗎?

在功能上,這兩個查詢可以根據數據產生不同的結果。假設我們有以下幾點:

Create Table S (Id int null) 
Create Table R (Id int null) 

insert S Values(1) 
insert S Values(1) 
insert S Values(2) 

insert R Values(1) 
insert R Values(2) 
insert R Values(3) 

Select * From @R As R, @S As S Where R.Id = S.Id 

這導致1,1,2

Select * From @R As R Where R.Id In(Select S.Id From @S As S) 

這導致1,2

第二個查詢會產生來自R有一個一行或更多 S中的值。第一個查詢類似於Inner Join(即使它正在使用交叉連接),它將爲R和S中匹配的每一行返回一行。由於S中有兩行與R中的一行相匹配,所以我們得到兩行的值爲1.

+0

+1用於指出替代語法。有太多人將他們的加入標準與他們的選擇標準混合在一起(並且不,他們並不總是產生相同的結果)。 – Duncan 2010-04-16 00:03:21