我有一个sql Table
Messages
它有 4列,这是
1. sno
2. sender_id
3. reciever_id
4. message
如果其中任何一个等于1,我将发出一个SELECT
语句,其中unique combination
为 sender_id , reciever_id 。 / p>
我还想要如果包含(1,3)的组合,则应忽略(3,1)
帮助将不胜感激
答案 0 :(得分:3)
适用于大多数RDBMS的SQL:
SELECT DISTINCT
CASE WHEN sender_id > reciever_id THEN reciever_id ELSE sender_id END,
CASE WHEN sender_id > reciever_id THEN sender_id ELSE reciever_id END
FROM
MyTable;
MySQL SQL方言(和ANSI SQL):
SELECT DISTINCT
LEAST(sender_id, reciever_id)
GREATEST(sender_id, reciever_id)
FROM
MyTable;
编辑,@ Edper的评论
CASE条件发生变化,但THEN / ELSE列也需要交换
SELECT DISTINCT
CASE WHEN sender_id > reciever_id THEN reciever_id ELSE sender_id END,
CASE WHEN sender_id <= reciever_id THEN reciever_id ELSE sender_id END
FROM
MyTable;
答案 1 :(得分:0)
试试这个:
SELECT
a.sender_id ,
a.reciever_id
FROM
Messages a
LEFT JOIN Messages b
ON a.sender_id = b.reciever_id
AND b.sender_id = a.reciever_id
WHERE
b.sender_id IS NULL
GROUP BY
a.sender_id ,
a.reciever_id
ORDER BY
NULL
答案 2 :(得分:0)
create table #temp(sno int,sender_id int,reciever_id int)
插入#temp
选择'1','1','1'
联合所有
选择'2','2','2'
联合所有
选择'3','3','3'
联合所有
选择'1','1','1'
联合所有
选择'2','2','2'
联合所有
选择'3','3','3'
联合所有
选择'3','3','3'
联合所有
选择'1','1','3'
联合所有
选择'1','3','1'
联合所有
选择'1','4','1'
联合所有
选择'1','1','4'
----试试这个: -
使用T(sender_id,reciever_id,dis)
AS
( 选择sender_id,reciever_id,ROW_NUMBER()over(PARTITION BY(sender_id + reciever_id)order by(sender_id + reciever_id))as dis from #temp
其中(sender_id = 1或reciever_id = 1)
group by sender_id,reciever_id
)
SELECT sender_id,reciever_id FROM T
其中dis = 1