Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 MS SQL 2008:查看“;变量";而不是加入_Sql Server 2008 - Fatal编程技术网

Sql server 2008 MS SQL 2008:查看“;变量";而不是加入

Sql server 2008 MS SQL 2008:查看“;变量";而不是加入,sql-server-2008,Sql Server 2008,基本上,我们有一个需要优化的视图。 现在的视图如下所示: SELECT * FROM IM_Data.history.v_SystemInfo si INNER JOIN IM_Data..systemOutDates od ON si.TopId = od.TopId AND si.OutDate = od.OutDate WHERE TopId = 196 如果我能让风景变成这样(我显然不能): 速度会快10倍。所以我要找的是一个足够了解SQL的人来帮我解决这个问

基本上,我们有一个需要优化的视图。 现在的视图如下所示:

SELECT *
FROM IM_Data.history.v_SystemInfo si
INNER JOIN IM_Data..systemOutDates od ON
    si.TopId = od.TopId
    AND si.OutDate = od.OutDate
WHERE 
    TopId = 196
如果我能让风景变成这样(我显然不能):

速度会快10倍。所以我要找的是一个足够了解SQL的人来帮我解决这个问题。我基本上需要查询TopDate一次,然后在所有行上使用相同的查询,而不是在每一行上使用join(因为这是浪费时间)

我不能删除TopDate,让查询视图的用户来处理它,因为使用视图的遗留代码太多了。因此,唯一的选择是让用户按现在的状态查询,但仍然以某种方式解决连接的性能损失


提前谢谢

我不确定我是否理解您的问题,但您可以使用子查询或临时加入条件表来获得一个结果。如果没有您的结构示例,几乎不可能判断是否有更好的选择。 我想类似这样的事情可能会接近您想要的——看看查询成本是否有帮助

SELECT * FROM 
    IM_Data.history.v_SystemInfo AS si INNER JOIN 
    (SELECT TOP 1 OutDate FROM IM_Data..systemOutDates WHERE sourceId = si.TopId) AS    tblOutDate
WHERE 
    si.TopId = 196 AND si.OutDate = tblOutDate.OutDate

使用子查询会导致对子查询中的每一行进行调用,因此这与原始join=/这不会编译相同,因为您没有在join之后指定on子句。此外,这种子查询(派生表)不能引用外部查询的表。我要更改的一件事是选择*,如果您认为是这样,最好是放置特定的列,而不是*。如果您的视图是从其他视图中选择的,则最好将嵌入式视图提升到顶层。我选择SELECT*的原因是视图是从具有指定列的历史视图中选择的。它只是在特定日期进行选择。
SELECT * FROM 
    IM_Data.history.v_SystemInfo AS si INNER JOIN 
    (SELECT TOP 1 OutDate FROM IM_Data..systemOutDates WHERE sourceId = si.TopId) AS    tblOutDate
WHERE 
    si.TopId = 196 AND si.OutDate = tblOutDate.OutDate