2012-02-22 88 views
1

我試圖編寫一個帶有內部連接的查詢,只有Table1的RepID存在於Table2中,如果不是則不連接到table2。對於我在下面使用的查詢,如果表2中不存在repID,我不會從兩個表中獲取。這怎麼可能?我正在使用sql server 2005.提前謝謝!內部連接,如果條件

Select * from Table1 
inner join Table2 on Table1.RepID = Table2.RepID 
where Table1.Date = @Date 
order by Table1.Date desc 
+0

你的意思是如果repID爲NULL? – Luke101 2012-02-22 21:19:17

+0

'SELECT * FROM Table1'應該是顯而易見的,結果中不會出現任何來自'Table2'的問題,這引出了一個問題:爲什麼你認爲你想加入到'Table2'?建議:編寫兩個查詢,每個條件一個('RepID'存在於兩個表中,'RepID'只存在於'Table1'中),然後將它們'UNION'放在一起,必要時爲任何缺失值提供DBA批准的缺省值。 – onedaywhen 2012-02-23 08:58:09

回答

2

如果在連接的兩側都找到匹配項,內部連接將只返回一行。如果你正在尋找的東西時找到匹配,將返回從表2 FROM表1中的所有行,但只記錄了,你想有一個左外連接:

select * from Table1 as t1 
left outer join Table2 as t2 
    on t1.RepID = t2.RepID 
where t1.Date = @Date 
order by t1.Date desc 
+0

謝謝賈斯汀!非常好的解釋。我相信我不會再忘記這一點! – Ram 2012-02-22 21:14:10

+0

您的查詢將返回'Table1'中的所有行,'Table2'中沒有行,並且如果在'right'一側找到多個匹配,那麼'left'一側的行將被複制。請向我解釋這樣的查詢是如何有用的。 – onedaywhen 2012-02-23 08:52:41

+0

@onedaywhen我沒有多個表上有一個RepID表的行。有什麼我仍然失蹤,請讓我知道。 :-) – Ram 2012-02-23 22:18:56

0

這聽起來像你真正想要的是一個左外連接,不是嗎?

+0

對,謝謝你! – Ram 2012-02-22 21:13:00

2

嘗試「LEFT JOIN」而不是「INNER JOIN」。

「LEFT」這個詞的意思是「始終包含連接左側表中的每條記錄」,在本例中爲Table1,因爲您將編寫:Table1 LEFT JOIN Table2和「Table1」位於左側那雙! :-)

+0

我知道,謝謝你的幫助! :-) – Ram 2012-02-22 21:13:19

+0

你能猜出RIGHT JOIN做什麼嗎? ;-) ;-) ;-) – 2012-02-22 21:50:55

+0

是的,我猜對了! :-) – Ram 2012-02-22 22:35:25

0
SELECT * 
    FROM Table1 
     LEFT JOIN Table2 
      ON Table1.RepID = Table2.RepID 
    WHERE Table1.Date = @Date 
    ORDER BY Table1.Date DESC; 
+0

謝謝喬!這有助於...... – Ram 2012-02-22 21:14:35

+0

如果'outer'表中有多個匹配的行,那麼您的查詢將從'Table1'返回重複的行。你可以通過在'SELECT'子句中添加'DISTINCT'來解決這個問題,但是更好的辦法就是完全刪除這個連接。這讓我想知道,這個答案有什麼意義? – onedaywhen 2012-02-23 08:55:29

0

這就是外部聯接是。

Select * from Table1 
left outer join Table2 on Table1.RepID = Table2.RepID 
where Table1.Date = @Date 
order by Table1.Date desc 
+0

感謝您在外部連接上的單挑! – Ram 2012-02-22 21:15:11