В Oracle вы можете сделать это:
SELECT DISTINCT LEAST(customer1, customer2),
GREATEST(customer1, customer2),
city
FROM T
См. http://sqlfiddle.com/#!4/b73ba/1
Простой и понятный. Но не очень эффективны (не можете использовать ваш индекс).
Если вам нужно сохранить customer1
и customer2
в том же порядке, как и в исходной таблице для не-дубликатов, вам, вероятно, нужно что-то более сложное:
SELECT T.* FROM T
JOIN (SELECT MIN(ROWID) RID
FROM T GROUP BY LEAST(customer1, customer2),
GREATEST(customer1, customer2),
city) V
ON T.ROWID = V.RID
Or (возможно лучше):
SELECT T1.* FROM T T1
LEFT JOIN T T2
ON T1.city = T2.city
AND T1.customer1 = T2.customer2
AND T1.customer2 = T2.customer1
WHERE T2.city IS NULL OR T1.customer1 < T1.customer2
См. http://sqlfiddle.com/#!4/f7bbd/3 для сравнения этих трех решений.
Если ключевые столбцы сопоставимы, и если их число невелико, вы можете создать составной столбец их отсортированных-конкатенированных значений и выбрать отличительные знаки в этой временной таблице. Если вы используете этот подход, обязательно используйте что-то необычное, чтобы приклеить ключи в составном. – Dinesh