我有一张表flight
如下:
arrive | depart
-------------------
New York | London
New York | Paris
Washington | Rome
London | New York
Rome | Washington
New York | Washington
New York | London
Rome | New York
Washington | Rome
我想根据distinct from
depart
/arrive
和arrive
/depart
生成一个独特的输出,但不是双向相同的输出。因此,上述结果将是:depart | arrive
______________________
New York | London
New York | Paris
Washington | Rome
New York | Washington
Rome | New York
直接得到不同的基
depart
/arrive
,但不能得到任何忽略双向相同(JOIN
/UNION
)的arrive
,depart
等,但包含双向唯一。把头发拔出来-需要帮助。谢谢
最佳答案
可以将NOT EXISTS
条件与相关子查询一起使用,以删除重复项。
但是要记住的一件事是,为了获得一致的结果集,您需要定义一个规则来区分两个目的地中的哪个被认为是depart
,哪个是arrive
。因为您没有提供规则,所以我选择将字母顺序最低的值设置为depart
。
查询:
SELECT
LEAST(depart, arrive) depart,
GREATEST(depart, arrive) arrive
FROM mytable t
WHERE NOT EXISTS (
SELECT 1
FROM mytable t1
WHERE t1.arrive = t.depart AND t1.depart = t.arrive AND t1.depart > t.depart
)
Demo on DB Fiddle:
| depart | arrive |
| -------- | ---------- |
| New York | Paris |
| London | New York |
| Rome | Washington |
| New York | Washington |
| New York | Rome |
另一个解决方案是使用主键
id
选择表中重复项的第一个出现,根据注释,主键在表中可用:SELECT depart, arrive
FROM mytable t
WHERE NOT EXISTS (
SELECT 1
FROM mytable t1
WHERE t1.arrive = t.depart AND t1.depart = t.arrive AND t1.id < t.id
)