2011-09-27 53 views
-1

我有一個SQL查詢像這樣加入:左外,在SQL查詢中,其中

select something 
from 
(
inner query here - outputs is correct: eg 2000 datasets 
) as a 

left outer join tableA 
on tableA.id=innerQuery.id 
where someYear = -----------> had to change this "and" to "where" 
(
select max(tableYear) 
from tableC 
where 
etc.... 
) 

eg years: 
2011, 1999, 1901 max is 2011. 
1978, 1981,1990 max is 1990. 

等。 我有問題,與「去哪兒」的聲明,我只是越來越少1600個數據集;然而,如果我要鍵入一個值並使用「和」,則輸出正確的是2000. 有沒有辦法在左外連接中使用「where」並獲取所有輸出?

+1

你能澄清嗎?你想要將比較作爲連接條件的一部分來執行,還是作爲最終結果的獨立條件?什麼表是「有點」? –

+0

爲什麼你必須使用「在哪裏」?另外,我不認爲「數據集」是你想說的正確術語。你得到2000行,它構成了1個數據集。 –

+0

是的,我希望比較是作爲左外部聯接的一部分來執行的,因爲字段名稱和比較只存在於tableA中,並且只適用於tableA。 – NULL

回答

1

如果您從WHERE子句中的LEFT JOINed表中測試列,則強制該連接的行爲就像它是INNER JOIN一樣。正確的方法是使該測試成爲連接條件的一部分。

+0

是的,這正是發生了什麼,我如何使連接條件的測試部分? – NULL

+0

@Menew:只需在'LEFT JOIN'上添加一個'AND'即可。 –

+0

當我這樣做時,sql給了我一個錯誤,提示「on子句無效」 – NULL

0

爲什麼不將條件作爲連接的一部分(因爲您已發佈?somedate必須來自右表,即tableA,因此它可能爲空。因此,如果您想獲得所有結果,則必須將帳戶對於如

IsNull(somedate, '1/1/2000') = '1/1/2000' 

(somedate = '1/1/2000' OR somedate is null) 
+0

好吧,所以我將這添加到我的查詢,它的工作原理(somedate爲空)!非常感謝,我忽略了你的答案! – NULL

1

LEFT JOIN,它的確與衆不同無論你把過濾器進入JOIN條款或到WHERE條款。

我這裏解釋很詳細的區別:
What is the difference in these two queries as getting two different result set?

要總結一下就是一句話:
如果你想全2000行並不僅僅是1600年,你必須把過濾器的JOIN子句。

+0

這正是我正在尋找的,但是,我想挑選最大值? – NULL

+0

@Menew:對不起,我不明白(還)。我在示例代碼中看到了'select maxYear here',但我不明白這與聯接有什麼關係(現在你的問題到底是什麼)。你能詳細說明嗎? –

+0

好吧我的代碼的作品,如果我給它一個最大的一年說2011年。這意味着,它會給我從2011年所有電影的每個人。但是,我也希望來自內部查詢的人是我的電影分辨率的電影, 2011年。 – NULL