2012-08-08 45 views
0
select art.artno, art.name from Art 
left outer join store on art.artno =store.artno 
where art.Artno not in (select art.artno from store) 

該查詢應該是這樣的,但似乎不工作(我沒有得到列名旁邊的任何結果行)。使用MSSQL 2008.如果只有一列與第二列部分匹配,我如何從第一個表中返回兩列?

table art    table store     EXPECTED RESULT 
artno name   artno qty     artno name 
    1 xbox360   1 1      2  XHW 
    2 XHW    3 2      5  PS2 
    3 NETANDO   4 1 
    5 PS2    6 3 
    6 PS1 
    4 X1 

如何編寫查詢以獲得示例中顯示的Expected out?

只是讓你知道表是100plus K行大,如果有幫助。

最後,爲什麼上面的代碼不起作用有些燈會是有益的。我看着這個this link似乎是外連接必須工作,可能是我根本無法理解這一點。我也試過full outer join,沒有幫助。使用except我只能找到artno,但沒有讓我生成name列。

回答

1

另一種方法可能是

select 
    a.`artno`, 
    a.`name` 
from 
    art a 
left join 
    store s on s.artno=a.artno 
where 
    s.artno is null 

大表上,第二種方法最有可能是更好的。

+0

@tuncay,謝謝。第二個選項有幫助,但不是第一個,我無法解釋爲什麼,但如果你這樣做會有幫助。 – tough 2012-08-08 12:06:52

+0

請您告訴我後面的's.artno'和's.artno'的位置是否與'join'語句的'left'和'right'有關。 – tough 2012-08-08 14:01:21

+0

我真的不這麼認爲。它是一個條件,我指定了明確的表別名(「a」和「s」)。 – 2012-08-08 14:05:05

0
select art.artno, art.name from art 
where art.artno not in (select store.artno from store) 

你不需要做任何形式的加入使用的內部查詢(在(select store.artno from store)在這種情況下)的。內部查詢就像構建一個臨時表,填充值並在查詢中使用它。

既然你想讓你的內部查詢給你所有artno在表store,你應該使用(select store.artno from store)而不是(select art.artno from store),因爲我認爲這將選擇從外部查詢art.artno,沒有考慮到store的內容表。

+0

這似乎不工作我也試過了。但不知道爲什麼?似乎必須加入才能得到這樣的結果。 – tough 2012-08-08 11:50:10

+0

這適用於sqlite3。我無法使用MSSQL進行測試,因爲我沒有它,對不起。 – 2012-08-08 11:56:28

0

喬治答案的作品,但在這種大小的表格與'不存在'相關子查詢會更快。

經過測試,我的子查詢比左邊的要慢。這是前進的方式

+0

@Tuncay和Gene:是的,但是這取決於所做的工作。優化器。例如,如果你在store.artno上有一個索引,而在art.artno上有另一個索引,那麼我認爲sqlite引擎的行爲與內部查詢一樣快,就像你已經建立了連接一樣。 – 2012-08-08 11:51:49

+0

隨着表格變大,與連接相比,子查詢總是會變得更慢。我通常儘量避免子查詢。 MySQL版本<4的教訓。 – 2012-08-08 12:01:55

+0

@gene,謝謝,這將需要大量的查詢時間,所以我試了一下,花了超過一分鐘,並停止了它。對不起,我不得不編輯我最初提出的匹配給定示例的查詢。 – tough 2012-08-08 12:09:22

相關問題