2014-02-12 83 views
-1

我得到一個「列BarMapping多次指定的錯誤」在SQL Server中。我無法弄清楚爲什麼。下面是我的代碼的樣子:爲什麼這個嵌套選擇產生一個錯誤

SELECT @FooCount= COUNT(*) FROM 
(SELECT * FROM Download_Table dl 
LEFT JOIN @BarMapping sm 
ON sm.cccID=dl.cccID 
WHERE DATEPART(hh, GETDATE())=DATEPART(hh, dl.DTS) AND sm.Store=73) errors 
+1

左連接的要點是什麼?您將得到相同的計數,只需要使用關於小時的where子句對下載表進行計數。還要注意,將WH.Store添加到WHERE子句會將左連接變爲內連接。 –

+0

這就是我經常遇到的情況,你能向我解釋爲什麼sm.Store將where子句轉換爲內連接嗎? –

+1

因爲它只能在存在值的行上匹配相等(比較null值爲73將爲false,並將該行刪除)。因此,可以從該過濾器返回的唯一行是也與連接條件相匹配的行。儘管如此,即使你解決了這個問題,我仍然不明白這個連接的重點 - 無論這個連接是否存在,計數都是一樣的。現在,如果你的意思是*因爲它是一個內部連接,那將是一個不同的故事。 –

回答

2

select *從不同的表中獲取相同的字段名稱。你在一個子查詢中使用它。爲什麼不這樣做:

SELECT @FooCount = COUNT(*) 
FROM Download_Table dl LEFT JOIN 
    @BarMapping sm 
    ON sm.cccID=dl.cccID AND sm.Store = 73 
WHERE DATEPART(HOUR, GETDATE()) = DATEPART(HOUR, dl.DTS); 

你根本不需要子查詢。

1

看起來你正在加入的兩個表(Download_Table和存儲過程BarMapping的結果)有一個共同的列,我想是BarMapping導致問題或混淆生成錯誤。所以要明確使用表和列的名稱,或者一個簡單的修復方法是將Count(*)更改爲Count(column_name)以使其工作

相關問題