Помощь с SQL-запросом в Oracle - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужна ваша помощь со следующим:

У меня есть такая таблица:

Table_Values ​​

ID   |  Value | Date

1    |  ASD   | 01-Jan-2019

2    |  ZXC   | 10-Jan-2019

3    |  ASD   | 01-Jan-2019

4    |  QWE   | 05-Jan-2019

5    |  RTY   | 15-Jan-2019

6    |  QWE   | 29-Jan-2019

Мне нужно получить значения, которыедублируется и имеет другую дату, например, значение "QWE" дублируется и имеет другую дату:

ID   |  Value | Date

4    |  QWE   | 05-Jan-2019

6    |  QWE   | 29-Jan-2019

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

При использовании EXISTS используется «коррелированный подзапрос».Поэтому я не думаю, что это лучше, чем JOIN.Однако оптимизатор Oracle может переписать «EXISTS» в JOIN.

Мне нравится использовать JOIN классическим способом:)

SELECT t1.* 
  FROM table_values t1, table_values t2 
 WHERE t1.f_value =  t2.f_value 
   AND t1.f_date  <> t2.f_date 
 ORDER BY 1; 
0 голосов
/ 27 февраля 2019

Использование Join:

select
   t1.* 
from
   Table_Values t1 
   join
      Table_Values t2 
      on t1.Value = t2.Value 
      and t1.Date <> t2.Date

Однако подход Exists лучше.

0 голосов
/ 27 февраля 2019

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

Один метод (по состоянию на Oracle 12c):

select id, value, date
from mytable
order by case when count(distinct date) over (partition by value) > 1 then 1 else 2 end
fetch first row with ties

Но вам придется поместить это в подзапрос (производная таблица / cte), если вы хотите отсортировать результат.

И еще один метод без предложения FETCH FIRST (действует для Oracle 8i):

select id, value, date
from
(
  select id, value, date, count(distinct date) over (partition by value) as cnt
  from mytable
)
where cnt > 1
order by id, value, date;

Решение forpas с EXISTS может быть быстрее, хоть.Ну, выбери какой метод тебе больше нравится: -)

0 голосов
/ 27 февраля 2019

С EXISTS:

select * from Table_Values t
where exists (
  select 1 from Table_Values
  where value = t.value and date <> t.date
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...