1

我有一个 sqlTable Messages 它有4 列

1. sno 
2. sender_id 
3. reciever_id 
4. message

当它们中的任何一个等于 1 时,我会做出一个SELECT声明,它是unique combinationsender_id和 reciever_id一个。

我还希望如果包含(1,3)的组合,则(3,1)应该被忽略

帮助将不胜感激

4

3 回答 3

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;
于 2013-06-28T06:52:43.980 回答
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
于 2013-06-28T06:53:40.077 回答
0

创建表#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

于 2013-06-28T09:20:03.900 回答