我有一个 sqlTable
Messages
它有4 列是
1. sno
2. sender_id
3. reciever_id
4. message
当它们中的任何一个等于 1 时,我会做出一个SELECT
声明,它是unique combination
sender_id和 reciever_id的一个。
我还希望如果包含(1,3)的组合,则(3,1)应该被忽略
帮助将不胜感激
适用于大多数 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;
试试这个:
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
创建表#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)
作为
( select 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)
按 sender_id、reciever_id 分组
)
从 T 中选择 sender_id、reciever_id
其中 dis=1