我想從兩個表,一個主表和一個事務表中拉出記錄。我的Master
表包含我所有的帳戶ID。我的transaction
表具有由這些帳戶運行的具有3列的任何交易:activity date
,income
和charge type
。SQL Server Management Studio 2008 - 爲什麼我的左連接不提供空記錄?
在transaction
表中,其中一些帳戶可能根本不顯示,因爲它們在給定的日期範圍內未執行交易。不過,當我查詢這些帳戶時,仍然需要這些帳戶顯示在我的結果列表中。
所以,我的數據是這樣的:
Master Table: Transaction Table:
| AccountID | | AccountID | ChargeType | ActivityDate| Income |
-------------- -------------------------------------------------
| 1 | | 2 | 2000 | 8/31/2012 | $99.00 |
| 2 | | 3 | 2000 | 7/31/2012 | $79.00 |
| 3 | | 5 | 2000 | 9/30/2012 | $79.00 |
| 4 |
| 5 |
我的查詢目前看起來像:
select
a.AccountID,
b.ChargeType,
b.ActivityDate,
b.Income
From
MasterTable as A
left join
TransactionTable as B on a.AccountID = b.AccountID
where
a.AccountID in ('1','2','3','4','5')
and
b.ActivityDate between '5/1/2012' and '11/30/2012'
據我瞭解,此查詢應該列出我選擇了全部5個賬戶,顯示在TransactionTable
中找不到的帳戶的值NULL
。
結果我想到:
| AccountID | ChargeType | ActivityDate| Income |
-------------------------------------------------
| 1 | NULL | NULL | NULL |
| 2 | 2000 | 8/31/2012 | $99.00 |
| 3 | 2000 | 7/31/2012 | $79.00 |
| 4 | NULL | NULL | NULL |
| 5 | 2000 | 9/30/2012 | $79.00 |
不正確的結果我收到代替:
| AccountID | ChargeType | ActivityDate| Income |
-------------------------------------------------
| 2 | 2000 | 8/31/2012 | $99.00 |
| 3 | 2000 | 7/31/2012 | $79.00 |
| 5 | 2000 | 9/30/2012 | $79.00 |
我認爲我在這裏誤解的東西根本。任何幫助是極大的讚賞!
在此先感謝!
爲什麼要將('1','2','3','4','5')部分中的'a.AccountID移動到'on'子句中?那件作品還不屬於「哪裏」?我知道這會不會影響結果,但語義那塊邏輯對'join' – ean5533
因爲戈登描述了爲什麼查詢不工作選爲最佳答案沒有影響。你不能在where子句中引用正確的表。 – tcshain
@ ean5533。 。 。對於左表上的過濾邏輯是在「on」子句還是在「where」子句中,沒有正確的答案。有人認爲「過濾」邏輯應該在'where'中,並且在'on'中加入邏輯。但是,表b上的條件似乎對大多數人來說都是過濾的,但它仍然屬於'on'子句。對我而言,我可能傾向於使用'where'b.ActivityDate'2012-01-05'和'2012-11-30'之間或者b.AccountId爲NULL',因爲這明確處理了'left outer join'。但是,學習SQL的人應該使用'on'子句學習正確的方法。 –