SQL-запрос для поиска только уникальных строк из 2 столбцов - PullRequest
1 голос
/ 22 февраля 2011

У меня есть таблица с 2 столбцами, оба имеют имена

Я хочу запрос, который находит только уникальные имена - имена, которые появляются только один раз максимум во всей таблице.

Например, для следующей таблицы:

NAME1    |     NAME2
--------------------
DAN             MIKE
MIKE            TONY
FOO              DAN

Должно быть возвращено только FOO и TONY.

Спасибо

Ответы [ 4 ]

2 голосов
/ 22 февраля 2011

Полагаю, вы могли бы сделать это несколькими способами, но вот один (при условии, что Name1 и Name2 имеют одинаковые или неявно конвертируемые типы):

SELECT [Name]
FROM (SELECT Name1 AS [Name] FROM [Table] UNION ALL SELECT Name2 FROM [Table])
GROUP BY [Name]
HAVING COUNT(*) = 1
1 голос
/ 22 февраля 2011

Как насчет простого:

select name1 from table where name1 not in (select distinct name2 from table ) 
union 
select name2 from table where name2 not in (select distinct name1 from table );
0 голосов
/ 22 февраля 2011

@ CheeseConQueso истолковал вопрос иначе, чем я. Я думал, что вы имели в виду уникальные имена из обоих столбцов вместе взятых.

Вот моя версия:

select name, count(*) from (select name1 as name from table union select name2 as name from table) group by name having count(*) = 1;

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

0 голосов
/ 22 февраля 2011

Пока name1 и name2 не могут быть нулевыми, используйте этот запрос:

SELECT t.Name1
FROM tableName t LEFT JOIN tableName t2 ON t.NAME1 = t2.NAME2
WHERE t2.NAME2 IS NULL
GROUP BY t.Name1
HAVING COUNT(*) = 1
UNION ALL
SELECT t.Name2
FROM tableName t LEFT JOIN tableName t2 ON t.NAME2 = t2.NAME1
WHERE t2.NAME1 IS NULL
GROUP BY t.Name2
HAVING COUNT(*) = 1

Если они могут быть нулевыми, используйте этот запрос:

SELECT Name
FROM (
  SELECT t.Name1 Name
  FROM tableName
  GROUP BY t.Name1
  HAVING COUNT(*) = 1
  UNION ALL
  SELECT t.Name2 Name
  FROM tableName
  GROUP BY t.Name2
  HAVING COUNT(*) = 1
) rs
GROUP BY Name
HAVING COUNT(*) = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...