Перестановка и комбинация
У меня есть таблица с одним столбцом, состоящим из 5 цветов
colour
-------
red
black
white
green
orange
Я хочу получить все комбинации, как
(красный, оранжевый) (черный, белый) .,, и т. д., за исключением идентичных. Я попытался соединить таблицу сам с собой.
select *
from table1 cross join table1
но я не получил желаемый ответ. Он вернул все комбинации. Также идентичные. Как я могу получить это? Есть ли другой способ сделать это без создания другой таблицы???
2 ответа
Если под идентичным вы подразумеваете пары типа (белый, белый), возможно, это то, что вы хотите:
SELECT a.color, b.color
FROM colors a
CROSS JOIN colors b
WHERE a.color != b.color
Если под идентичным вы дополнительно имеете в виду сохранить только один из (белый, черный) или (черный, белый), возможно, это то, что вы хотите:
SELECT a.color, b.color
FROM colors a
CROSS JOIN colors b
WHERE a.color > b.color
Важной частью является отклонение элементов, которые вам не нужны, после выполнения перекрестного соединения.
Обратите внимание, что это не приведет к созданию новых таблиц или изменению существующих. a
а также b
это просто два разных псевдонима для одной и той же таблицы colors
, В таблице только один столбец color
, но так как таблица присутствует в SELECT дважды, вам необходимо различать оба (концептуальных, а не фактических!) экземпляра colors
Таблица.
Вы не можете обойтись без join
(тогда у вас будет слишком мало строк), и вы не можете легко обойтись без псевдонимов (вы должны обратиться к обоим столбцам, чтобы отклонить некоторые строки), а также нет причин назначать псевдонимы.
Комбинации:
SELECT a.color,b.color
FROM colors a
JOIN colors b
ON a.color < b.color
Перестановки:
SELECT a.color,b.color
FROM colors a
JOIN colors b
ON a.color != b.color