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 行)
*/
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 行)
*/
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 赵六
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 行)
我没有完全说清楚,所以二位都用了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,毛八这时,应该怎么查询呢?
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 行)
-------能保证成对出现,但不一定按库中顺序成对出现
能解释一下整个的思路吗?非常感谢。
还有“a.worker_mate_id+ '_ '”是什么意思呢?发现去掉后,查询结果是一样的
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 毛八
其中赵六与王五的顺序不一样