select XXX from d A
join (select XXX from a,b,c where.........) B
on A.id = B.id   注意集合B中select 的字段必须包含id

解决方案 »

  1.   

    实在不好意思,我还想问个问题,现在我是选出来了,可是我又碰到个问题:我现在在 select XXX,b.location as 地点,MAX(b.date) as 时间 from d A
    join (select XXX from a,b,c where.........) B
    on A.id = B.id
    group by XXX.b.location因为这里我在select里用了MAX()所以,所以一定要在最后加group by,可是这里出现了一个问题! 就是因为我现在想得出的就是比如下面的一个结果(某个人离现在最近的一个时间所在的地点)
      姓名  地点  时间
      张三  上海  2006-1-1
      李四  昆明  2005-12-31
    但是数据库里,可能有这样几条纪录(或多条纪录)
      张三  上海  2006-1-1
      张三  海南  2005-12-12
      张三  上海  2006-12-5
      张三  海南  2005-1-1
    现在我只想得出
      张三  上海  2006-1-1
    可是如果用了MAX(date)聚合函数,在select 地点的时候必须把它列到group by 否则没法会报错,可是如果列了,那么得到的结果就是
      张三  上海  2006-1-1
      张三  海南  2005-12-12
    因为它根据地点group了,可是这不是我想要的啊,我想要的就是关于每个人最近去过的地方,也就是只要
      张三  上海  2006-1-1这要怎么写才能得出我想要的结果啊,帮帮我吧!
      

  2.   

    第一点:你的max(date)函数实现不了(即选出)关于每个人最近去过的地方!
    举例: 2006-1-1和 2006-12-5 两个时间 max()后选出的是前面个而不是后面个
    因为字符'-'比 字符'2'大,字符排序!
    需要改为: max(cast(b.date as datetime)) 经转化后再比较!第二点: 你可以只根据人名group by 就可以用max()函数了,
    为什么非还要对地点group by呢?
    不知道你全部的表结构是怎样的
      

  3.   

    说一个笨方法,子查询select XXX,
    (select top 1 location from b where id=B.id order by date desc) as 地点,
    --b.location as 地点,
    MAX(b.date) as 时间 from d A
    join (select XXX from a,b,c where.........) B
    on A.id = B.id
    group by XXX.b.location你看看是否可以
      

  4.   

    修改了group by子句,这样看看select XXX,
    (select top 1 location from b where id=B.id order by date desc) as 地点,
    --b.location as 地点,
    MAX(b.date) as 时间 from d A
    join (select XXX from a,b,c where.........) B
    on A.id = B.id
    group by XXX
      

  5.   

    可可,谢谢你关于第一点的提醒
    我现在的问题是:在select中,我想显示列 name,location,MAX(date),如果我只在select里面选择location,而在group by 里面不加上location的话,sql就会报错亚:" location在选择列表里无效,因为它既不包含在聚合函数里,又不包含在group by 子句中",所以必须加啊!你说应该怎么办?
      

  6.   

    可以这样转:给你个例子,你看看先
    declare @p table(a int ,b int ,c int)
    insert @p 
    select 1,2,3 union all
    select 2,2,3 union all
    select 1,3,5 union all
    select 2,4,6 union all
    select 2,4,2 select a,c=max(c)  from @p group by aselect d.* from @p d  join (select a,c=max(c)  from @p group by a)t
    on d.a=t.a and d.c=t.c
      

  7.   

    如果你写:select a,b,c=max(c)  from @p group by a
    就会出现你那个错误!
      

  8.   

    谢谢指点啊!我下午有事出去了,没来得及感谢! 第一次发贴子,衷心感谢这么多朋友的热心帮助,特别是可可,真的谢谢了!不过我想最后还问个问题,如果@p表里面有很多记录(其实也不算很多,目前几千条),就象我现在用的这个表,那么这么join 一下,好像速度不是很快,明显感觉到在程序里要等好几秒,可能就查出来一百多条匹配纪录,用vb的datagrid显示(就是因为速度的原因我想重写原来的那个查询)我想问一下如果想提高速度的话,能有什么好的建议吗?
      

  9.   

    提升性能要考虑,主键、外键、聚合索引、非聚合索引
    字段值不要为null