连接表变量与连接视图

时间:2011-05-13 08:05:06

标签: tsql join view

我有一个运行速度非常慢的存储过程。因此,我想在单独的视图中提取一些查询。

我的代码看起来像这样:

DECLARE @tmpTable TABLE(..)

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

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

然后我提取(复制 - 粘贴)* query *并将其放在视图中 - 即vView。

这样做会给我一个不同的结果:

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

为什么呢?我可以看到vView和@tmpTable都返回3000行,所以它们应该匹配(也检查除了查询)。

任何评论都会受到很多评论,因为我觉得这很困惑......

已编辑:

这是获取结果的完整查询(使用@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 个答案:

答案 0 :(得分: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,一个有值(特别是对于影响JOIN的sid列)
  3. 最后,当你说“不同的结果”时你的意思是你得到x2或x3行吗?一个不同的COUNT?什么?