2014-10-28 2 views
0

У меня есть запросSQL найти строки, не имеющих дубликат столбца значения

select * from circuit where y ='b'; 

я получаю следующий результат

x  | location_a | location_b | y 
----------------------------------------- 
1232 |  mexico | usa  | b 
1232 |  mexico | usa  | b 
1232 |  brasil | usa  | b 
9999 |  brasil | usa  | b 

Мне нужно выяснить x, что не имеет никакого повторного location_a и location_b. В этом случае должны быть напечатаны следующие данные.

1232 |  brasil | usa  | b 
9999 |  brasil | usa  | b 

Я использую Oracle 10g. Пожалуйста, дайте мне знать, если это возможно. (Отчетливая/группа по удалит дубликаты, но все равно будет держать одну строки, которая мне не нужна)

ответ

1

Вы можете использовать аналитические функции для подсчета совпадений, а затем фильтр:

select x, location_a, location_b, y 
from (select c.*, 
      count(*) over (partition by x, location_a, location_b) as cnt 
     from circuit 
    ) c 
where cnt = 1; 

EDIT:

Предложение over вводит аналитические функции. Чтобы понять их, вы можете начать с документации (см. here). То, что эта конкретная функция делает, - присваивать значение каждой строке в наборе результатов. Значение - это количество строк, где x, location_a и location_b имеют то же значение, что и указанная строка. Для данных, было бы назначить:

x  | location_a | location_b | y | cnt 
----------------------------------------------- 
1232 |  mexico | usa  | b | 2 
1232 |  mexico | usa  | b | 2 
1232 |  brasil | usa  | b | 1 
9999 |  brasil | usa  | b | 1 

Первые две строки имеют «2», потому что есть два ряда с 1232/Мексика/США. Последние два имеют 1, потому что их триплеты уникальны.

+0

Спасибо @Gordon Не могли бы вы объяснить, что это число (*) в течение 9 ... сделала здесь, так что я могу использовать его в будущее. – Zeus

+0

Узнал что-то новое сегодня. Спасибо, Гордон. – Zeus

2

Вы можете использовать group by и удалить дубликаты добавить условие: having count(*) = 1:

select x, location_a, location_b 
from circuit 
where y ='b' 
group by x, location_a, location_b 
having count(*) = 1 
+0

Мне нравится ваш ответ. Я чувствую себя глупо от того, что сейчас не использую предложение. Еще раз спасибо! – Zeus

Смежные вопросы