我有一张表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 fromdepart/arrivearrive/depart生成一个独特的输出,但不是双向相同的输出。因此,上述结果将是:
depart      | arrive
______________________
New York    | London
New York    | Paris
Washington  | Rome
New York    | Washington
Rome        | New York

直接得到不同的基depart/arrive,但不能得到任何忽略双向相同(JOIN/UNION)的arrivedepart等,但包含双向唯一。
把头发拔出来-需要帮助。谢谢

最佳答案

可以将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
)

10-07 16:10