有两个表,每个表2个字段
信息表(id,其他信息)
附加条件表(id,数字)
要求:
查询信息表的内容,其中,id在附加条件表里的先列出来,列的顺序按数字大小从大到小排序。其他的信息跟在后面。
怎么写?

解决方案 »

  1.   

    SELECT * 
    FROM 信息表 AS A
    ORDER BY 
        CASE WHEN EXISTS(SELECT *
                         FROM 附加条件表
                            WHERE A.id=id)
                 THEN A.id
             ELSE 999999999999
         END
      

  2.   

    DECLARE @信息表 table(id int,data varchar(20))
    INSERT @信息表 VALUES(1,'123')
    INSERT @信息表 VALUES(2,'234')
    INSERT @信息表 VALUES(3,'345')
    INSERT @信息表 VALUES(4,'456')DECLARE @附加条件表 table(id int,data varchar(20))
    INSERT @附加条件表 VALUES(2,'adbc')
    INSERT @附加条件表 VALUES(4,'adbc')SELECT * 
    FROM @信息表 AS A
    ORDER BY 
        CASE WHEN EXISTS(SELECT *
                         FROM @附加条件表
                            WHERE A.id=id)
                 THEN A.id
             ELSE 999999999999
         END
    /*
    id          data
    ----------- --------------------
    2           234
    4           456
    1           123
    3           345(4 行受影响)*/
      

  3.   


    SELECT * 
    FROM 信息表 AS A
    ORDER BY 
        CASE WHEN EXISTS(SELECT *
                         FROM 附加条件表
                            WHERE A.id=id)
                 THEN A.id
             ELSE 999999999999
         END,
         A.id --这里再加上这个
      

  4.   

    非常感谢 liangCK 
    不过附加条件表的第二列是数字,不是字符串,排序不是按id,而是按照附加条件表的数字大小
      

  5.   

    DECLARE @信息表 table(id int,data varchar(20))
    INSERT @信息表 VALUES(1,'123')
    INSERT @信息表 VALUES(2,'234')
    INSERT @信息表 VALUES(3,'345')
    INSERT @信息表 VALUES(4,'456')
    INSERT @信息表 VALUES(5,'567')DECLARE @附加条件表 table(id int,data int)
    INSERT @附加条件表 VALUES(2,542)
    INSERT @附加条件表 VALUES(4,235)
    INSERT @附加条件表 VALUES(5,123)SELECT * 
    FROM @信息表 AS A
    ORDER BY 
        --如果存在.就存附加条件表里的data列进行排序.
        --你将这个data换成你实际表的列名
        --如果不存在.则按信息表里的id排序
        CASE WHEN EXISTS(SELECT *
                         FROM @附加条件表
                            WHERE A.id=id)
                 THEN (SELECT TOP 1 data
                       FROM @附加条件表
                       WHERE id=A.id)
             ELSE 999999999999
         END,
         A.id/*
    id          data
    ----------- --------------------
    5           567
    4           456
    2           234
    1           123
    3           345(5 行受影响)*/
      

  6.   

    没弄出来,我再试试看。
    我这里原来是没有附加条件表的,sql大概如下if @page_index=1
    set @temp='select top '+str(@page_size)+' * from table_shop where '+@str_where+' order by '+@str_order_by
    else
    set @temp='select top '+str(@page_size)+' * from table_shop where '+@str_where+' and (shop_id not in (select top '+str((@page_index-1)*@page_size)+' shop_id from table_shop where '+@str_where+' order by '+@str_order_by+')) order by '+@str_order_by
    exec(@temp)现在多了一个附加条件表,我也不知道怎么插进去了
      

  7.   

    以前orderby是这样的if @order_by<>''
         set @str_order_by=@order_by+' '+@taxis
    else    set @str_order_by='last_edit_time desc'
      

  8.   

    select a.*,b.数字 
    from 信息表 a,附加条件表 b
    where a.id = b.id
    union
    select *,0
    from 信息表
    where 信息表.id not in
    (select id from 附加条件表)
    order by b.数字 desc以上语句没测试,楼主试试看能不能借鉴。
      

  9.   

    liangck你的例子的结果就是我想要的。
    不过我改了半天还没有改出来,我再试试看了!谢谢!
      

  10.   

    liangck你的例子的结果就是我想要的。
    不过我改了半天还没有改出来,我再试试看了!谢谢!