2011-05-13 73 views
0

我有一個存儲過程,運行速度很慢。因此,我想在單獨的視圖中提取一些查詢。加入表變量與加入視圖

我的代碼看起來是這樣的:

DECLARE @tmpTable TABLE(..) 

INSERT INTO @tmpTable (..) *query* (returns 3000 rows) 

Select ... from table1 
inner join table2 
inner join table3 
inner join @tmpTable 
... 

然後我提取物(複製粘貼)*查詢*並把它放在一個觀點 - 即vView。

那麼這樣做會給我不同的結果:

Select ... from table1 
    inner join table2 
    inner join table3 
    inner join vView 
    ... 

爲什麼?我可以看到vView和@tmpTable都返回了3000行,所以它們應該匹配(也做一個除查詢外的檢查)。

任何意見將大大appriciated因爲我覺得很堅持了這個..

編輯:

這是用於獲取結果的完整查詢(使用@tmpTable或vView給了我不同的結果,雖然看起來是一樣的):

select dep.sid as depsid, dep.[name], COUNT(b.sid) as possiblelogins, count(ls.clientsid) as logins 
from department dep 
inner join relationship r on dep.sid=r.primarysid and r.relationshiptypeid=27 and r.validto is null 
inner join [user] u on r.secondarysid=u.sid 
inner join relationship r2 on u.sid=r2.secondarysid and r2.validto is null and r2.relationshiptypeid in (1,37) 
inner join client c on r2.primarysid=c.sid 
inner join ***@tmpTable or vView*** b on b.sid = c.sid 
left outer join (select distinct clientsid from logonstatistics) as ls on b.sid=ls.clientsid 
GROUP BY dep.sid, dep.[name],dep.isdepartment 
HAVING dep.isdepartment=1 
+1

請問您能提供更多的代碼和信息嗎? @tmpTable查詢中是否存在WHERE? JOIN不同?它是「更多行」還是「重複」? – gbn 2011-05-13 08:31:35

+0

我添加了選擇本身,但建立@tmpTable和vView的查詢是一個沉重的問題,它包含內部聯接,聯合等,但結果集是不同的。 – femseks 2011-05-13 08:40:10

+0

和INSERT INTO @tmpTable代碼的定義好嗎? – gbn 2011-05-13 09:02:56

回答

1

如果你改變這個,你可能不需要視圖/表。

它加入到client c,似乎是有隻加入到logonstatistics

--remove inner join ***@tmpTable or vView*** b on b.sid = c.sid 
--change JOIN 
left outer join (select distinct clientsid from logonstatistics) as ls on c.sid=ls.clientsid 

和SELECT子句中更改COUNT(b.sid)COUNT(c.sid)

否則,如果你得到不同的結果,你有兩個選擇我可以看到:

  1. 表和視圖有不同的數據。你有逐行比較嗎?
  2. 一個具有NULL,一個具有價值(特別是對SID列,這將影響到JOIN)

最後,當你說:「不同的結果」你的意思是你X2或X3行?不同的COUNT?什麼?

+0

INNER JOIN也可用於過濾行。 – 2011-05-14 20:28:51