powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
25 сообщений из 25, страница 1 из 1
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757141
Sheriffua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет...Похоже заработался и не могу понять как правильно построить запрос для таблицы в которой сразу должны выполняться несколько условий для одного и того же атрибута. Имеем след. таблицу такого вида:

ID PRIZNAK69762316 ОСОБА_169762316 АДРЕСА_169762316 НОМЕР_169762317 ОСОБА_169762317 НОМЕР_169762318 АДРЕСА_169762319 ОСОБА_169762319 АДРЕСА_169762319 НОМЕР_1

в конечном итоге в выборку должны попасть значения с ID=69762316,69762319, т.е. для каждой ID одновременно должно выполняться три условия атрибута PRIZNAK=ОСОБА_1, PRIZNAK=АДРЕСА_1, PRIZNAK=НОМЕР_1

БД:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757146
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sheriffuaне могу понять как правильно построить запросТы начни его строить хоть как-то, а потом приходи с конкретными вопросами.
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757148
Sheriffua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicSheriffuaне могу понять как правильно построить запросТы начни его строить хоть как-то, а потом приходи с конкретными вопросами.
так в том-то и дело, что пока не ясно в какую сторону идти...пришел узнать направление )))
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757150
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sheriffuaпришел узнать направление
Код: plsql
1.
having count(distinct PRIZNAK) = 3


http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757170
Sheriffua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicSheriffuaпришел узнать направление
Код: plsql
1.
having count(distinct PRIZNAK) = 3


http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM

за направление спасибо.
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757190
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, речь шла про троекратное соединение таблицы сама-с-собой при равенстве ID и соответствующих значениях PRIZNAK
Предварительная оптимизация, что ID должны иметь не меньше 3 разных PRIZNAK, наверняка, только улучшит скорость выборки
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757221
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

імхо, count будет быстрее

.....
stax
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757256
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровВозможно, речь шла про троекратное соединение таблицы сама-с-собой при равенстве ID и соответствующих значениях PRIZNAK
На большом объеме решение так себе, группировка может показать существенно лучший результат.
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757271
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВячеслав ЛюбомудровВозможно, речь шла про троекратное соединение таблицы сама-с-собой при равенстве ID и соответствующих значениях PRIZNAK
На большом объеме решение так себе,Да что стесняться -- это решение УЖАСНО
Но я не вижу другого решения для той задачи, как я ее понял -- отобрать ID, имеющие в своих полях PRIZNAK ВПОЛНЕ ОПРЕДЕЛЕННЫЕ ЗНАЧЕНИЯ
В данном случае, хотя бы 3. Есть еще вариант только 3, и никаких других

Хоть я давно не занимаюсь программированием, мне было бы интересно узнать более другой метод решения данной задачиandrey_anonymousгруппировка может показать существенно лучший результат.Уже интересней
Можно как-нибудь развить эту тему?
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757280
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНо я не вижу другого решения для той задачи, как я ее понял -- отобрать ID, имеющие в своих полях PRIZNAK ВПОЛНЕ ОПРЕДЕЛЕННЫЕ ЗНАЧЕНИЯcount может быть не один, а свой на каждый признак. pivot называется. Еще коллекцию можно сравнить с эталоном.
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757285
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровМожно как-нибудь развить эту тему?
Да чего там развивать-то?
- памяти выделить (вплоть до "руками") под sort/hash
- фильтр по интересующему набору критериев
- группировка по интересующему ключу с пивотингом
- итоговый фильтр на агрегаты
Делал так для одного крупного заказчика сопоставление продаж трех и более периодов (проверка последовательного выполнения критериев программы лояльности) - эффект вполне себе положительный в сравнении с решением на join (в том случае удалось снизить общее время выполнения с двух+ часов до, ЕМНИП, 5-7 минут).
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757288
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоп-стоп-стоп
Мы берем первоначальную картинку аффтара с 3 разными значениями PRIZNAK?
Тут вообще вопросов не возникает
Только сдается мне, что там могут быть и ОСОБА_11 и АДРЕСА_124 (т.е. типичная EAV)

Тогда был бы благодарен с простым примером SQL запроса (черт, ну неужели нельзя подать хоть из жалости?)
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757301
Sheldon Cooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровСтоп-стоп-стоп
Мы берем первоначальную картинку аффтара с 3 разными значениями PRIZNAK?
Тут вообще вопросов не возникает
Только сдается мне, что там могут быть и ОСОБА_11 и АДРЕСА_124 (т.е. типичная EAV)

Тогда был бы благодарен с простым примером SQL запроса (черт, ну неужели нельзя подать хоть из жалости?)
???

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 
SQL> 
SQL> with t(ID,PRIZNAK) as
  2  (
  3  select 69762316,  'ОСОБА_1' from dual union all
  4  select 69762316,  'АДРЕСА_1' from dual union all
  5  select 69762316,  'НОМЕР_1' from dual union all
  6  select 69762317,  'ОСОБА_1' from dual union all
  7  select 69762317,  'НОМЕР_1' from dual union all
  8  select 69762317,  'НОМЕР_1' from dual union all
  9  select 69762318,  'АДРЕСА_1' from dual union all
 10  select 69762319,  'ОСОБА_1' from dual union all
 11  select 69762319,  'АДРЕСА_1' from dual union all
 12  select 69762319,  'НОМЕР_1' from dual
 13  )
 14  select ID from t where PRIZNAK in ('ОСОБА_1','АДРЕСА_1','НОМЕР_1') group by id having count(distinct PRIZNAK) = 3;
        ID
----------
  69762319
  69762316
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757303
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757307
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

я так понял задание
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  1  with t (id,priznak) as (
  2  select 69762316,'ОСОБА_1' from dual union all
  3  select 69762316,'АДРЕСА_1' from dual union all
  4  select 69762316,'НОМЕР_1' from dual union all
  5  select 69762316,'НОМЕР_1' from dual union all
  6  select 69762316,'ПАСПОРТ_1' from dual union all
  7  select 69762317,'ОСОБА_11' from dual union all
  8  select 69762317,'ОСОБА_1' from dual union all
  9  select 69762317,'НОМЕР_1' from dual union all
 10  select 69762318,'АДРЕСА_1' from dual union all
 11  select 69762319,'ОСОБА_1' from dual union all
 12  select 69762319,'АДРЕСА_1' from dual union all
 13  select 69762319,'НОМЕР_1' from dual)
 14  --
 15  select id from t where priznak in ('ОСОБА_1','АДРЕСА_1','НОМЕР_1')
 16* group by id having count(distinct priznak)=3
SQL> /

        ID
----------
  69762319
  69762316



.....
stax
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757312
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все правильно
Это у меня мох в мозгах
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757327
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxя так понял задание
Более развернутый вариант:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select id
  from t 
 where priznak in ('ОСОБА_1','АДРЕСА_1','НОМЕР_1')
 group by id 
having count(case priznak when 'ОСОБА_1' then 1 end) = 1
   and count(case priznak when 'АДРЕСА_1' then 1 end) = 1
   and count(case priznak when 'НОМЕР_1' then 1 end) between 1 and 2 -- у 69762316 два атрибута "НОМЕР_1", как с ним поступить - вопрос требований 



Пример с "более другой" фильтрацией:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with t (id,priznak,val) as (
select 69762316,'ОСОБА_1'  , 'Вася' from dual union all
select 69762316,'АДРЕСА_1' , 'Кржыжановского' from dual union all
select 69762316,'НОМЕР_1'  , '74993574122' from dual union all
select 69762316,'НОМЕР_1'  , '74959874562' from dual union all
select 69762316,'ПАСПОРТ_1', 'VII-245673' from dual union all
select 69762317,'ОСОБА_11' , 'Петрович' from dual union all
select 69762317,'ОСОБА_1'  , 'Петя' from dual union all
select 69762317,'НОМЕР_1'  , '79991234567' from dual union all
select 69762318,'АДРЕСА_1' , 'Бутлерова' from dual union all
select 69762319,'ОСОБА_1'  , 'Валентин' from dual union all
select 69762319,'АДРЕСА_1' , 'Кожедуба' from dual union all
select 69762319,'НОМЕР_1'  , '79993574891' from dual)
--
select id
  from t 
 where priznak in ('ОСОБА_1','АДРЕСА_1','НОМЕР_1')
 group by id 
having min(case priznak when 'ОСОБА_1' then val end) = 'Вася'
   and min(case priznak when 'АДРЕСА_1' then val end) is not null
   and min(case priznak when 'НОМЕР_1' then val end) is not null
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757332
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Код: plsql
1.
вопрос требований

Почему все норовят идти в разрез с бритвой Оккама, сами себе придумывая "требования"?
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757361
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandrey_anonymous
Код: plsql
1.
вопрос требований

Почему все норовят идти в разрез с бритвой Оккама, сами себе придумывая "требования"?

если признак уникален в пределах ид то и distinct не нужен

21780539

.....
stax
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757362
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandrey_anonymous
Код: plsql
1.
вопрос требований

Почему все норовят идти в разрез с бритвой Оккама, сами себе придумывая "требования"?
Потому что этот пост был адресован не ТС, а Вячеславу.
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757368
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

between 1 and 2 плохо, если значений 3, 4 ..., напр признак 'НОМЕР ТЕЛЕФОНА'

.....
stax
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757369
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousПотому что этот пост был адресован не ТС, а Вячеславу.Если бы этим грешил только один пост…
Да и Вячеслав уже посыпался пеплом.
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757512
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousStaxя так понял задание
Более развернутый вариант:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select id
  from t 
 where priznak in ('ОСОБА_1','АДРЕСА_1','НОМЕР_1')
 group by id 
having count(case priznak when 'ОСОБА_1' then 1 end) = 1
   and count(case priznak when 'АДРЕСА_1' then 1 end) = 1
   and count(case priznak when 'НОМЕР_1' then 1 end) between 1 and 2 -- у 69762316 два атрибута "НОМЕР_1", как с ним поступить - вопрос требований 


тут нужен sum, а не count

Если на id висит индекс, но в таблице оооооочень много строк и большая часть id соответствует требованиям выборки, то план по вашему варианту с группировкой свалится в фулскан и будет ооооочень тяжело.
Тогда лучше сделать так:
Код: plsql
1.
2.
3.
4.
select t1.id from t t1 where 3= (select count(t2.priznak)
  from t t2 
 where priznak in ('ОСОБА_1','АДРЕСА_1','НОМЕР_1')
 and t2.id = t1.id)
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757515
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelandrey_anonymousпропущено...

Более развернутый вариант:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select id
  from t 
 where priznak in ('ОСОБА_1','АДРЕСА_1','НОМЕР_1')
 group by id 
having count(case priznak when 'ОСОБА_1' then 1 end) = 1
   and count(case priznak when 'АДРЕСА_1' then 1 end) = 1
   and count(case priznak when 'НОМЕР_1' then 1 end) between 1 and 2 -- у 69762316 два атрибута "НОМЕР_1", как с ним поступить - вопрос требований 


тут нужен sum, а не count

Если на id висит индекс, но в таблице оооооочень много строк и большая часть id соответствует требованиям выборки, то план по вашему варианту с группировкой свалится в фулскан и будет ооооочень тяжело.
Тогда лучше сделать так:
Код: plsql
1.
2.
3.
4.
select t1.id from t t1 where 3= (select count(t2.priznak)
  from t t2 
 where priznak in ('ОСОБА_1','АДРЕСА_1','НОМЕР_1')
 and t2.id = t1.id)



1) чем сум 1 отличаетя от count
2) скоко ид Вы получите?

......
stax
...
Рейтинг: 0 / 0
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
    #39757528
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fogelтут нужен sum, а не countШилом нагляднее указывать куда пойти. С мылом могут не так понять.

FogelТогда лучше сделать такНесомненно, умножение того же full scan на себя же ускоритв разы. А потерянный distinct ускорит еще и еще.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]