комбинации (не перестановки) из кросс-соединения в sql - PullRequest
16 голосов
/ 18 августа 2011

Если у меня есть таблица, которую я хотел бы соединить с самим собой, как я могу удалить дублирующиеся строки?Или, другими словами, как я могу сделать перекрестное объединение «заказ не имеет значения»?

Так, например, если у меня есть таблица T:

field |
-------
   A  |
   B  |
   C  |

и якрест соединиться с собой, чтобы я не получил A |Строки

T as t1
cross join
T as t2
  on t1.field != t2.field

Я бы получил следующее:

field | field
------+-------
  A   |   B
  A   |   C
  B   |   A
  B   |   C
  C   |   A
  C   |   B

Однако для меня A, B такое же, как B, A.

Есть лихороший способ удалить эти дубликаты?Другими словами, я хочу комбинации, а не перестановки.

1 Ответ

24 голосов
/ 18 августа 2011
T as t1
inner join
T as t2
  on t1.field < t2.field

FWIW, вы можете просто использовать INNER JOIN для этого, это не строго CROSS JOIN.MySQL (и, возможно, некоторые другие RDBMS) рассматривают эти два типа объединения как идентичные, но в ANSI SQL перекрестное соединение не имеет условия соединения - это преднамеренный декартовой продукт.

...