Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута / 25 сообщений из 25, страница 1 из 1
09.01.2019, 13:42
    #39757141
Sheriffua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Всем привет...Похоже заработался и не могу понять как правильно построить запрос для таблицы в которой сразу должны выполняться несколько условий для одного и того же атрибута. Имеем след. таблицу такого вида:

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
09.01.2019, 13:46
    #39757146
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Sheriffuaне могу понять как правильно построить запросТы начни его строить хоть как-то, а потом приходи с конкретными вопросами.
...
Рейтинг: 0 / 0
09.01.2019, 13:51
    #39757148
Sheriffua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
ElicSheriffuaне могу понять как правильно построить запросТы начни его строить хоть как-то, а потом приходи с конкретными вопросами.
так в том-то и дело, что пока не ясно в какую сторону идти...пришел узнать направление )))
...
Рейтинг: 0 / 0
09.01.2019, 13:55
    #39757150
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Sheriffuaпришел узнать направление
Код: plsql
1.
having count(distinct PRIZNAK) = 3


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


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

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

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

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

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

Тогда был бы благодарен с простым примером SQL запроса (черт, ну неужели нельзя подать хоть из жалости?)
...
Рейтинг: 0 / 0
09.01.2019, 16:21
    #39757301
Sheldon Cooper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Вячеслав ЛюбомудровСтоп-стоп-стоп
Мы берем первоначальную картинку аффтара с 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
09.01.2019, 16:23
    #39757303
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Спасибо
...
Рейтинг: 0 / 0
09.01.2019, 16:28
    #39757307
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Вячеслав Любомудров,

я так понял задание
Код: 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
09.01.2019, 16:32
    #39757312
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Все правильно
Это у меня мох в мозгах
...
Рейтинг: 0 / 0
09.01.2019, 16:45
    #39757327
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
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
09.01.2019, 16:48
    #39757332
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
andrey_anonymous
Код: plsql
1.
вопрос требований

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

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

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

21780539

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

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

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

.....
stax
...
Рейтинг: 0 / 0
09.01.2019, 17:13
    #39757369
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
andrey_anonymousПотому что этот пост был адресован не ТС, а Вячеславу.Если бы этим грешил только один пост…
Да и Вячеслав уже посыпался пеплом.
...
Рейтинг: 0 / 0
09.01.2019, 21:25
    #39757512
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
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
09.01.2019, 21:46
    #39757515
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
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
09.01.2019, 22:17
    #39757528
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из таблицы значений подходящей под 3 и более условий для одного атрибута
Fogelтут нужен sum, а не countШилом нагляднее указывать куда пойти. С мылом могут не так понять.

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


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