Вопрос по Оракл SQL / ну или по SQL 99 или какой он там....

User avatar
Arte
Удалена за неоплаченную рекламу
Posts: 104
Joined: 21 Apr 2002 23:57
Location: Latvia -> Ireland

Вопрос по Оракл SQL / ну или по SQL 99 или какой он там....

Post by Arte »

В конце работчего дня совсем башка не варит...
в общем имеем табличку:


SHOPPER_DESC_TBL
____________________
USERID
NAME
VALUE

запрос типа

Code: Select all

 select userid from shopper_attribute_tbl where name='member_emailaddress' and value ='email@email.com' 
выдаёт мне USERID для узера с одним и тем-же емайлом, проблема в том что емаил по идее в системе должен быть уникальным. Как выбрать значения где емаил повторяется? Нечто вроде DISTINCT, только наоборот... или может нечто вроде

Code: Select all

select userid from shopper_tbl where (select count(1) from where ....) >1;


ПС: я не оракл дба и многие вещи могу не знать, можно на пальцах, если не сложно? ;)
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

select value,count(*) from shopper_attribute_tbl
where name='member_emailaddress'
group by value
having count(*)>1
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Niky
Уже с Приветом
Posts: 550
Joined: 31 Mar 2000 10:01
Location: Moscow --> Baltimore, MD

Post by Niky »

Code: Select all

select distinct t1.userid, t1.value 
from shopper_attribute_tbl t1, shopper_attribute_tbl t2
where t1.name='member_emailaddress'
and t2.name='member_emailaddress'
and t1.value=t2.value
and t1.userid <> t2.userid
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: Вопрос по Оракл SQL / ну или по SQL 99 или какой он там....

Post by tengiz »

Arte wrote:ПС: я не оракл дба и многие вещи могу не знать, можно на пальцах, если не сложно? ;)

Ну есть более простой путь - успешно решить задачу на известном продукте (скажем, на MySQL) а потом попробовать применить аналогичное решение на Oracle - в надежде на то, что Oracle тоже так сумеет.
Cheers
User avatar
Arte
Удалена за неоплаченную рекламу
Posts: 104
Joined: 21 Apr 2002 23:57
Location: Latvia -> Ireland

Post by Arte »

Спасибо. Оба варианта неплохие...

Code: Select all

group by value 
having count(*)>1
довольно интересный оборот... раньше такого не встречал.

А двойная выборка из той-же таблицы - у меня бродила в голове, но видать не туда куда надо зашла :oops:
User avatar
Arte
Удалена за неоплаченную рекламу
Posts: 104
Joined: 21 Apr 2002 23:57
Location: Latvia -> Ireland

Re: Вопрос по Оракл SQL / ну или по SQL 99 или какой он там....

Post by Arte »

tengiz wrote:Ну есть более простой путь - успешно решить задачу на известном продукте (скажем, на MySQL) а потом попробовать применить аналогичное решение на Oracle - в надежде на то, что Oracle тоже так сумеет.

Гхм... не уверен что так мною любимый mySQL справился бы с этим извращением.
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: Вопрос по Оракл SQL / ну или по SQL 99 или какой он там....

Post by vc »

Arte wrote:В конце работчего дня совсем башка не варит...
в общем имеем табличку:


SHOPPER_DESC_TBL
____________________
USERID
NAME
VALUE

запрос типа

Code: Select all

 select userid from shopper_attribute_tbl where name='member_emailaddress' and value ='email@email.com' 
выдаёт мне USERID для узера с одним и тем-же емайлом, проблема в том что емаил по идее в системе должен быть уникальным. Как выбрать значения где емаил повторяется? Нечто вроде DISTINCT, только наоборот... или может нечто вроде

Code: Select all

select userid from shopper_tbl where (select count(1) from where ....) >1;


ПС: я не оракл дба и многие вещи могу не знать, можно на пальцах, если не сложно? ;)


SQL-99:

Code: Select all

select * from (select userid, value, count(*) over (partition by userid, value) cnt 
from shopper_attribute_tbl cnt) where cnt > 1


VC
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: Вопрос по Оракл SQL / ну или по SQL 99 или какой он там....

Post by vc »

Arte wrote:В конце работчего дня совсем башка не варит...
в общем имеем табличку:


SHOPPER_DESC_TBL
____________________
USERID
NAME
VALUE



It was not clear where you meant duplicates per each user or duplicate e-mail values for the whole relation. If the latter, then:

Code: Select all


select distinct * from (select userid, value, count(*) over (partition by value) cnt
from shopper_attribute_tbl cnt) where cnt > 1



sql-92:

Code: Select all


select  userid, value from t1 where value in (select value from  t1 group by value having count(*)>1)



VC
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: Вопрос по Оракл SQL / ну или по SQL 99 или какой он там....

Post by tengiz »

Arte wrote:Гхм... не уверен что так мною любимый mySQL справился бы с этим извращением.

Нет, это не извращение - это совершенно обычная стандартная операция, предусмотренная ANSI/ISO SQL, причём намного раньше, чем с 99 года. Если MySQL с этим не справляется, то я снимаю шляпу перед мужеством его пользователей, которые плачут, но продолжают жрать кактус.
Cheers
User avatar
YellowMan
Уже с Приветом
Posts: 1099
Joined: 30 Sep 1999 09:01
Location: Bryansk,RUSSIA >> Dublin, Ireland

Post by YellowMan »

tenzig ! :nono#: :mrgreen:

Я тоже периодически ловлю Internal SQL Server error на вложенных запросах внутри группировки с rollup - ну и что ? Всегда есть способ переписать запрос, пусть и с большей ценой, зато рабочий...
Удачи@С.Смирнов
zVlad
Уже с Приветом
Posts: 15312
Joined: 30 Apr 2003 16:43

Post by zVlad »

Извращением в этой теме является структура, на которой автор темы получил проблему. Эта структура не для реляционного механизма. С такой структурой ее создатели лишают себя много того что дает реляционная база данных.
А вообще если Вам нужна уникальность - создавайте уникальный индекс.

Return to “Вопросы и новости IT”