Подтвердить что ты не робот

Выберите различные комбинации из двух столбцов

У меня есть два столбца, источник и назначение в таблице Hyperlink, чтобы сохранить источник и назначение гиперссылок.

source | destination 
-------------------- 
  a    |  b 
  b    |  c 
  c    |  d 
  c    |  b 

Существует две гиперссылки, включающие как b, так и c. Разница между двумя гиперссылками - это направление гиперссылки. Однако моя цель - получить уникальные гиперссылки, независимо от того, в каком направлении. Поэтому для гиперссылок, таких как от b до c и от c до b, я просто хочу выбрать один из них. Любой мог бы сделать.

Итак, мои результаты должны выглядеть так:

source | destination 
-------------------- 
  a    |  b 
  b    |  c 
  c    |  d 

До сих пор я смог реализовать это на Java с некоторой обработкой, прежде чем выполнять SQL-запросы с использованием JDBC. Однако это будет очень утомительно, когда таблица становится очень большой.

Интересно, есть ли в любом случае я могу сделать это в SQL вместо этого.

Я пробовал SELECT DISTINCT source,destination FROM Hyperlink, но он возвращает мне уникальные перестановки. Мне нужны уникальные комбинации.

Спасибо!

4b9b3361

Ответ 1

Это легко достижимо с наименьшим() и наибольшим() оператором, но поскольку MySQL не поддерживает их, вам нужно использовать конструкцию CASE для получения меньшего/большего. С двумя столбцами это нормально, но это решение становится довольно грязным, когда задействованы еще несколько столбцов.

select distinct 
          case 
            when source < destination then source 
            else destination 
          end as source,
          case 
            when source > destination then source 
            else destination 
          end as destination
from hyperlinks

Ответ 2

Попробуйте выполнить следующий запрос:

SELECT DISTINCT source, destination FROM hyperlink
MINUS 
SELECT destination, source FROM hyperlinks WHERE source < destination;

Это работает для Oracle. Если вы используете PostgreSQL, DB2 или TSQL, используйте ключевое слово EXCEPT вместо MINUS.

EDIT: В MySQL нет эквивалента этих ключевых слов. Вам придется обойти это, выбрав значения, предложенные Джим Риордан. Я не собираюсь удалять свой ответ в случае, если кто-то должен сделать это в любой из четырех основных СУБД.

Ответ 3

Вы можете использовать объединение двух отдельных запросов на соединение так:

SELECT
lhs.source, lhs.destination
FROM Hyperlink lhs
LEFT OUTER JOIN Hyperlink rhs
ON rhs.source = lhs.destination
WHERE rhs.source IS NULL
UNION
SELECT
lhs.source, lhs.destination
FROM Hyperlink lhs
JOIN Hyperlink rhs
ON rhs.source = lhs.destination
WHERE rhs.destination <> lhs.source
ORDER BY source;

Первый запрос получает ссылки, у которых нет источника в качестве адресата, второй получает совпадения с источником в качестве адресата, но разные противоположности. Вероятно, это не самая быстрая реализация, но если у вас есть индексы в столбцах источника и получателя, это поможет вам, независимо от того, будет ли он работать для вас, зависит от того, насколько велика таблица гиперссылок или она может получить.

Ответ 4

Я пробовал этот запрос, и он работал у меня

SELECT table1.Source, table1.Destination FROM dbo.hyperlinks table1 WHERE NOT EXISTS
(SELECT * FROM hyperlinks table2 WHERE table1.Source = table2.Destination AND table2.Source = table1.Destination)

UNION 

SELECT TOP 1 table1.Source, table1.Destination FROM hyperlinks table1 WHERE 
  (SELECT COUNT(*) FROM hyperlinks table2 WHERE table1.Source = table2.Destination AND  table2.Source = table1.Destination) > 0