declare @a table(workder_id int,name varchar(20),worker_mate_id int,worker_mate_name  varchar(20))
insert @a select 1,'张三',3,'李四' 
union all select 2,'王五',4,'赵六' 
union all select 3,'李四',1,'张三' 
union all select 4,'赵六',2,'王五' 
union all select 5,'赵六',2,'王五' select workder_id,name,worker_mate_id,worker_mate_name from(
select a.*,case when a.worker_mate_id=b.workder_id and a.workder_id=b.worker_mate_id and a.workder_id>b.workder_id then a.workder_id else b.workder_id  end x from @a a , @a b 
where a.worker_mate_id=b.workder_id and a.workder_id=b.worker_mate_id)aa
order by x,workder_id
--result
/*
workder_id  name                 worker_mate_id worker_mate_name     
----------- -------------------- -------------- -------------------- 
1           张三                   3              李四
3           李四                   1              张三
2           王五                   4              赵六
4           赵六                   2              王五(所影响的行数为 4 行)
*/

解决方案 »

  1.   

    --好委屈
    select * from worker a where exists(select 0 from worker b where a.workder_id=b.worker_mate_id)
    order by (case when workder_id>worker_mate_id then worker_mate_id else workder_id end)
    ----------------------------
    workder_id  name       worker_mate_id worker_mate_name 
    ----------- ---------- -------------- ---------------- 
    1           张三         3              李四
    3           李四         1              张三
    4           赵六         2              王五
    2           王五         4              赵六
      

  2.   

    select a.* from worker a,worker b where a.workder_id=b.worker_mate_id 
    order by (case when a.workder_id>a.worker_mate_id then a.worker_mate_id else a.workder_id end)
    ------------------------------
    workder_id  name       worker_mate_id worker_mate_name 
    ----------- ---------- -------------- ---------------- 
    1           张三         3              李四
    3           李四         1              张三
    4           赵六         2              王五
    2           王五         4              赵六(所影响的行数为 4 行)
      

  3.   

    then a.worker_mate_id+0.1---排序还得加0.1(1,3,4,2-->1,3,2,4)
      

  4.   

    非常感谢楼上二位回答。
    我没有完全说清楚,所以二位都用了id进行比较。
    假设说Id不是数字呢(也就是说Id不一定是什么形式)?并且还存在尚未配对的数据也要求显示。
    即如果数据如下: 
    a,张三,b,李四 
    c,王五,d,赵六 
    b,李四,a,张三 
    d,赵六,c,王五 
    e,孙七,f,毛八
    这里,"e,孙七,f,毛八"中"f,毛八"数据尚未录入。但也要求把这个显示出来。即a,张三,b,李四 
    b,李四,a,张三 
    c,王五,d,赵六 
    d,赵六,c,王五 
    e,孙七,f,毛八这时,应该怎么查询呢?
      

  5.   

    select a.* from worker a left join worker b on a.workder_id=b.worker_mate_id 
    order by (case when a.workder_id>a.worker_mate_id then a.worker_mate_id+'_' else a.workder_id end)
    -----------
    workder_id name       worker_mate_id worker_mate_name 
    ---------- ---------- -------------- ---------------- 
    a          张三         b              李四
    b          李四         a              张三
    c          王五         d              赵六
    d          赵六         c              王五
    e          孙七         f              毛八(所影响的行数为 5 行)
    -------能保证成对出现,但不一定按库中顺序成对出现
      

  6.   

    wgzaaa :我实在不理解“left join worker b on a.workder_id=b.worker_mate_id  ”这部分的作用。
    能解释一下整个的思路吗?非常感谢。
    还有“a.worker_mate_id+ '_ '”是什么意思呢?发现去掉后,查询结果是一样的
      

  7.   

    sorry,开始是你要求成对的,要那样才行,如果没同事的也列出就不要left join 那句了,
    select * from worker order by 
    (case when workder_id>worker_mate_id then worker_mate_id+'_' else workder_id end)
    a          张三         b              李四
    b          李四         a              张三
    c          王五         d              赵六
    d          赵六         c              王五
    e          孙七         f              毛八
    -----------------------------------------去了 +'_'是这样
    workder_id name       worker_mate_id worker_mate_name 
    ---------- ---------- -------------- ---------------- 
    a          张三         b              李四
    b          李四         a              张三
    d          赵六         c              王五
    c          王五         d              赵六
    e          孙七         f              毛八
    其中赵六与王五的顺序不一样