Перестановка и комбинация

У меня есть таблица с одним столбцом, состоящим из 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
Другие вопросы по тегам