Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Поиск дубликатов записей по нескольким полям  [new]
ghjdjlrf
Member

Откуда:
Сообщений: 229
подскажите, пожалуйста, как найти записи с дубликатами по нескольким столбцам:
select *
from libr_records
where (formno, invno, datevid) in (
select (formno, invno, datevid)
from libr_records
having count(*) > 1
group by formno, invno, datevid
)
order by formno, invno, datevid;
1 сен 10, 11:54    [9362435]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
AmKad
Member

Откуда:
Сообщений: 5222
ghjdjlrf,

1
1 сен 10, 12:00    [9362505]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
ghjdjlrf
Member

Откуда:
Сообщений: 229
Спасибо, это сделал:
SELECT datevid,formno, invno, COUNT(*)
FROM libr_records
group by datevid,formno, invno
having count(*)>1;

А как вывести все эти записи без группировки, например:
datevid formno invno поле4 поле5
01.01.2001 1 456 лллл
01.01.2001 1 456
02.01.2001 6 753
02.01.2001 6 753 вввв ыыыы
1 сен 10, 15:44    [9365029]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Попробуйте ещё раз перечитать ссылку... Где Вы там видите аггрегацию?
1 сен 10, 16:09    [9365254]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ghjdjlrf
Спасибо, это сделал:
SELECT datevid,formno, invno, COUNT(*)
FROM libr_records
group by datevid,formno, invno
having count(*)>1;

А как вывести все эти записи без группировки, например:
datevid formno invno поле4 поле5
01.01.2001 1 456 лллл
01.01.2001 1 456
02.01.2001 6 753
02.01.2001 6 753 вввв ыыыы


select * from libr_records where (datevid,formno, invno) in (SELECT datevid,formno, invno
FROM libr_records
group by datevid,formno, invno
having count(*)>1)
1 сен 10, 16:10    [9365267]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
ghjdjlrf
Member

Откуда:
Сообщений: 229
всем большое спасибо!
1 сен 10, 16:17    [9365327]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Поиск дубликатов записей по нескольким полям  [new]
frato
Member

Откуда:
Сообщений: 19
Я переделал под свой случай, мне нужно для дубликатов, определённых по нескольким полям выбрать значение FIO у дублирующихся строк.
Простой поиск дубликатов по нескольким полям без выборки FIO работает хорошо.
Также хорошо работает поиск с выборкой FIO если делаем поиск дубликатов по одному полю.
А вот при поиске дубликатов по нескольким полям и выборкой FIO по дублирующимся записям - возникает ошибка.
Делал так:
select FIO from Persons where I, O in
(select I, O from Persons
group by I, O having count(*)>1)

Где ошибка? Как сделать правильно?
27 мар 13, 01:41    [14099604]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18479
tst> select * from dual where dummy, 1 in (select dummy, 1 from dual);
select * from dual where dummy, 1 in (select dummy, 1 from dual)
                              *
ERROR at line 1:
ORA-00920: invalid relational operator


tst> select * from dual where (dummy, 1) in (select dummy, 1 from dual);

D
-
X
27 мар 13, 01:47    [14099611]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
frato
Member

Откуда:
Сообщений: 19
Имеется ввиду, что первые две строки вызовут ошибку, а последняя приведённая строка правильная?
А group by нужен? Оставлять?
Что такое dummy? Заменить его последовательностью нужных полей?
А что такое dual ?
27 мар 13, 12:18    [14101012]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
Sacramento
Member [заблокирован]

Откуда: from Paris with love
Сообщений: 525
frato
А что такое dual ?

Это то чем занимались Дантес и Пушкин
27 мар 13, 12:20    [14101020]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Sacramento
Это то чем занимались Дантес и Пушкин
Такого оригинального ответа я еще не слышал.
27 мар 13, 12:23    [14101063]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
frato,

очки вам ненужны?
Вячеслав Любомудров
tst> select * from dual where dummy, 1 in (select dummy, 1 from dual);
select * from dual where dummy, 1 in (select dummy, 1 from dual)
                              *
ERROR at line 1:
ORA-00920: invalid relational operator


tst> select * from dual where (dummy, 1) in (select dummy, 1 from dual);

D
-
X
27 мар 13, 12:32    [14101140]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
frato
Member

Откуда:
Сообщений: 19
Я извиняюсь, в SQL знаю только три команды, программирую иногда на дэлфи, а с SQL мало имел дело.
Первые две предложенные строки выполнить не пытался, т.к. указано что их выполнение приведёт к ошибке.
А при выполнении строки
select * from dual where (dummy, 1) in (select dummy, 1 from dual)

выводится ошибка с предупреждением, что таблица dual не существует.
Можете подсказать подробнее как реализовать сказанное выше поподробнее?
27 мар 13, 16:21    [14102860]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
frato
при выполнении строки
select * from dual where (dummy, 1) in (select dummy, 1 from dual)

выводится ошибка с предупреждением, что таблица dual не существует.
Можете подсказать подробнее как реализовать сказанное выше поподробнее?

1. Соединиться с Oracle RDBMS :)
27 мар 13, 16:23    [14102872]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
Sacramento
Member [заблокирован]

Откуда: from Paris with love
Сообщений: 525
andrey_anonymous
1. Соединиться с Oracle RDBMS :)
узами Гименея
27 мар 13, 16:29    [14102924]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
frato
Member

Откуда:
Сообщений: 19
Соединяюсь дэлфёй через ADO к mdb. Соединение есть, другие SQL-запросы работают.
27 мар 13, 18:01    [14103560]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
frato
Соединяюсь дэлфёй через ADO к mdb

Молодец, возьми с полки пирожок и двигай в форум по MS Access.
27 мар 13, 18:07    [14103592]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
Sacramento
Member [заблокирован]

Откуда: from Paris with love
Сообщений: 525
кэп, это форум автомобилистов, аксесы за дверью направо, прости
27 мар 13, 18:09    [14103605]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
frato
Member

Откуда:
Сообщений: 19
Понял. Извиняюсь.
Я был уверен, что если задачу по данной теме можно реализовать с помощью SQL-запросов, то в delphi этот запрос тоже нормально отработает.
27 мар 13, 18:19    [14103656]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
Sacramento
Member [заблокирован]

Откуда: from Paris with love
Сообщений: 525
frato, если ты создаш табличку dual в своей базе с колонкой dummy, то возможно тот запрос перестанет ругаться :-)
27 мар 13, 18:38    [14103744]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
frato
Member

Откуда:
Сообщений: 19
Заработало, решил задачу так:
select FIO from Persons where I+O+DR in
(select I+O+DR from Persons
group by I+O+DR having count(*)>1) 

Всем спасибо!
28 мар 13, 13:26    [14106898]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
frato
Заработало, решил задачу так:


Т.e. для тебя

Строка 1: I=1, O=2, DR=3
Строка 2: I=3, O=1. DR=2

это дубликаты???

SY.
28 мар 13, 15:19    [14107851]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
frato
Member

Откуда:
Сообщений: 19
Я попробовал промоделировать, добавил строки-псевдодубликаты, в которых попереставлял местами существующие значения, участвующие в запросе и всё отработало корректно, эти записи не определились как дубликаты.
Может это связано с тем, что я использую не совсем Oracle и сказывается влияние разных диалектов SQL.
28 мар 13, 18:12    [14109198]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Вам просто надо на таких псевдо проверить :)

Строка 1: I=1, O=11, DR=1
Строка 2: I=11, O=1, DR=1

С именем/отчеством, конечно, вероятность меньше, но она никак не нулевая :)
28 мар 13, 18:23    [14109257]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов записей по нескольким полям  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10039
frato
Может это связано с тем, что я использую не совсем Oracle и сказывается влияние разных диалектов SQL.


Не знаю что ты там переставлял. И самое главное для чего. To что 1 + 2 + 3 = 3 + 1 + 2 нужно проверять???

with Persons as (
                 select 'frato' fio,1 i, 2 o,3 dr from dual union all
                 select 'not-frato',3 i, 1 o,2 dr from dual
                )
select FIO from Persons where I+O+DR in
(select I+O+DR from Persons
group by I+O+DR having count(*)>1) 
/

FIO
---------
frato
not-frato

SQL> 


Не изобретай велосипед и сравни c использованием tuples:

with Persons as (
                 select 'frato' fio,1 i, 2 o,3 dr from dual union all
                 select 'not-frato',3 i, 1 o,2 dr from dual
                )
select FIO from Persons where (I,O,DR) in
(select I,O,DR from Persons
group by I,O,DR having count(*)>1) 
/

no rows selected

SQL> 


Кроме того тебе необходимо определить равны ли в твоей бизнес логике два NULL. Т.e.

Строка 1: I=1, O=NULL, DR=3
Строка 2: I=1, O=NULL. DR=3

есть дубликаты или нет?

SY.
28 мар 13, 18:56    [14109401]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить