查找SQL中不同列具有相同值的行

时间:2019-12-09 19:03:15

标签: mysql sql

我正在使用具有以下列的表[user]

user_id | em_id | em_id_original
--------|-------|---------------
1       | 32    |    NULL
2       | 43    |    32
3       | 14    |    13
4       | 75    |    98
5       | 98    |    NULL
...

现在,我要查找两列 em_id em_id_original 相同的行对。因此,如果您在上面的表上运行查询,它将生成以下输出。

user_id | em_id | em_id_original
--------|-------|---------------
1       | 32    |    NULL
2       | 43    |    32
4       | 75    |    98
5       | 98    |    NULL

第一对(用户ID 1和2):em_id = em_id_original = 32

第二对(用户ID 4和5):em_id = em_id_original = 98

谢谢

4 个答案:

答案 0 :(得分:1)

您可以使用相关子查询和EXISTS来检查是否存在一行对应项。

SELECT u1.user_id,
       u1.em_id,
       u1.em_id_original
       FROM `[user]` u1
       WHERE EXISTS (SELECT *
                            FROM `[user]` u2
                            WHERE u2.em_id = u1.em_id_original)
              OR EXISTS (SELECT *
                                FROM `[user]` u2
                                WHERE u2.em_id_original = u1.em_id);

答案 1 :(得分:0)

在我看来,您可以使用一个简单的子查询来完成此操作,尽管我不得不跳到有关数据集的一些结论,如果这个错误,您可能想向数据中添加更多例外,以便我们做得更好了解您的模型。

SELECT user_id, em_id, em_id_original
FROM [user]
WHERE em_id_original IS NULL OR em_id_original IN (SELECT em_id FROM [user])

答案 2 :(得分:0)

使用自我加入:

select distinct u1.*
from `user` u1 inner join `user` u2
on u2.em_id_original = u1.em_id or u1.em_id_original = u2.em_id 
order by u1.user_id

如果在任何情况下distinctem_id中都不会出现多次,则可以删除u1.em_id_original,反之亦然。
请参见demo

| user_id | em_id | em_id_original |
| ------- | ----- | -------------- |
| 1       | 32    | NULL           |
| 2       | 43    | 32             |
| 4       | 75    | 98             |
| 5       | 98    | NULL           |

答案 3 :(得分:0)

您可以尝试

SELECT * 
FROM test t
WHERE EXISTS (  SELECT 'a'
                FROM test t2
                WHERE t2.em_id = t.em_id_original
            )
OR EXISTS (  SELECT 'a'
             FROM test t2
             WHERE t2.em_id_original = t.em_id 
           )

DEMO