如何优化此T-sql查询?

如何优化此T-sql查询?,sql,sql-server,tsql,Sql,Sql Server,Tsql,在这个查询中,在最后一个where条件中有一个循环。还有这个 对SQL的性能造成严重问题 我不知道如何修改它 select pr.tavpun from mta110 pr where pr.taisoc = mta110.taisoc and pr.taitar = mta110.taitar and pr.taydat = mta110.taydat and pr.tairef = mta110.tairef and pr.tatind = (select max

在这个查询中,在最后一个where条件中有一个循环。还有这个 对SQL的性能造成严重问题

我不知道如何修改它

select pr.tavpun
 from mta110 pr
 where pr.taisoc = mta110.taisoc
   and pr.taitar = mta110.taitar
   and pr.taydat = mta110.taydat
   and pr.tairef = mta110.tairef
   and pr.tatind = (select max(pr2.tatind) from mta110 pr2
                    where pr2.taisoc = mta110.taisoc
                      and pr2.taitar = mta110.taitar
                      and pr2.taydat = mta110.taydat
                      and pr2.tairef = mta110.tairef
                      and pr2.tatind <= mgc100.gntind)) AS SalesPrice

您的查询没有什么意义,因为pr不是mta110的合理别名,而且mta110在外部查询中无法识别

我推测您有两个表,pr和mta110,它们是连接在一起的,您希望每个匹配行都有最新的mta110行

如果此解释正确,则可以使用行号和正确的连接:


您的查询没有什么意义,因为pr不是mta110的合理别名,而且mta110在外部查询中无法识别

我推测您有两个表,pr和mta110,它们是连接在一起的,您希望每个匹配行都有最新的mta110行

如果此解释正确,则可以使用行号和正确的连接:


它是否使用子查询的别名作为比较操作数进行编译?无论如何,请显示CREATETABLE和CREATEINDEX语句。显示执行计划。然后将一些示例数据作为INSERT添加到语句中,并使用该示例数据添加所需的结果,以及有关查询背后逻辑的解释。奇怪的查询,您的意思是拥有一个丢失的自连接,如果没有where子句,则该查询可能无效。mta110没有上下文作为别名;因此,子句pr.taisoc=mta110.taisoc将出现关于未知对象或别名mta110的错误。此外,什么时候taisoc除了为空之外没有taisoc的值?如果您正在检查NULL,那么您应该只使用taisoc IS NOTNULL。使用示例数据和所需结果解释逻辑将有所帮助。您的查询无效,因为mta110未在外部查询中定义。是否使用子查询的别名作为比较操作数进行编译?无论如何,请显示CREATETABLE和CREATEINDEX语句。显示执行计划。然后将一些示例数据作为INSERT添加到语句中,并使用该示例数据添加所需的结果,以及有关查询背后逻辑的解释。奇怪的查询,您的意思是拥有一个丢失的自连接,如果没有where子句,则该查询可能无效。mta110没有上下文作为别名;因此,子句pr.taisoc=mta110.taisoc将出现关于未知对象或别名mta110的错误。此外,什么时候taisoc除了为空之外没有taisoc的值?如果您正在检查NULL,那么您应该只使用taisoc IS NOTNULL。使用示例数据和所需结果解释逻辑将有所帮助。您的查询无效,因为mta110未在外部查询中定义。您好,Gordon,您的假设正是如此。非常感谢你的回答。我的SQL太差了。。。你能帮我查一下另一个问题吗?我不明白逻辑嗨,戈登,你的假设就是这样。非常感谢你的回答。我的SQL太差了。。。你能帮我查一下另一个问题吗?我不明白逻辑。。
select . . .
from pr join
     (select m.*,
             row_number() over (partition by taisoc, taitar, taydat, tairef order by gntind desc) as seqnum
      from mta110 m
     ) m
     on pr.? = m.?
where seqnum = 1;