查询文章表中每个栏目下最新的2篇文章
select a.id,a.title,a.columnid from news a where a.id in (select top 2 id from news where columnid = a.columnid order by pubdate desc) order by a.columnid asc
这样是可以的
可是如果是这样
select a.id,a.title,a.columnid from news a left join (select top 2 id from news where columnid = a.columnid order by pubdate desc) b on a.id = b.id order by a.columnid asc
就报“列前缀 'a' 与查询中所用的表名或别名不匹配。”
请问这是为什么?

解决方案 »

  1.   

    這where columnid = a.columnid這里出錯
      

  2.   

    用left join和你原意不符吧!!
      

  3.   

    2005可用:把left join 替換為
    cross apply/outer apply
      

  4.   

    select top 2 id from news where columnid = a.columnid order by pubdate desc这句有问题。。第2种写法是错误的,不能这么写
      

  5.   

    另外,第一句是in(存在),但第二名是left join(返回左表所有行),和第一句的意思不一样
      

  6.   

    第二语句中select top 2 id from news where columnid = a.columnid order by pubdate desc定义表的别名为b,表示该查询是一个单独的查询,该语句必须能够单独执行,而在上面的语句中,a表或者别名都是不存在的,当然要出错误。
      

  7.   

    把in改成join是考虑到效率的问题就“查询文章表中每个栏目下最新的2篇文章”这个题目,怎样的sql才是效率较好的,news表有1000w条记录
      

  8.   

    (select id from news as a
    where a.id = some (select top 2 id from news where columnid=a.columnid order by pubdate desc)) as b
      

  9.   

    感觉第一个效率可以了,要看实际情况再用in还是join
      

  10.   


    兄弟,你有没有注意 some 和 in 是等价的
      

  11.   

    应该说在此in未必比join效率低,如果说真的是1000W条的纪录进行查找,通过语句来解决效率问题是很难的,你必须建立索引或者主键,这样才能够大幅提高查询的效率。