Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск 2х записей / 25 сообщений из 35, страница 1 из 2
28.03.2019, 17:26
    #39793173
elimpion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Здравствуйте, можно ли без использования выполнить этот запрос без использования подзапроса
Код: plsql
1.
2.
3.
4.
5.
select * from test1 t
where t.name = 'card'
and t.id in (select t1.id
               from test1 t1  
              where t1.name = 'pan')


логика такая, что нам нужно найти записи в которых есть 'card' и 'pan'
...
Рейтинг: 0 / 0
28.03.2019, 17:27
    #39793175
elimpion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
*можно ли выполнить этот запрос без использования подзапроса
...
Рейтинг: 0 / 0
28.03.2019, 17:31
    #39793181
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
elimpion,

Тебе SY уже приводил пример.
...
Рейтинг: 0 / 0
28.03.2019, 17:34
    #39793187
elimpion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
-2-elimpion,

Тебе SY уже приводил пример.
с использованием LAG?
...
Рейтинг: 0 / 0
28.03.2019, 17:36
    #39793190
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Код: plsql
1.
2.
3.
where level = 2
start with 'pan'
connect by id and 'card'
...
Рейтинг: 0 / 0
28.03.2019, 17:44
    #39793197
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
elimpion,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  1  with t as (
  2  select 'card' n,   0 id from dual union all
  3  select 'pan' n,    0 id from dual union all
  4  select 'card' n,   0 id from dual union all
  5  select 'pan' n,    0 id from dual union all
  6  select 'card' n,   1 id from dual union all
  7  select 'pan' n,    1 id from dual union all
  8  select 'Stax' n,   1 id from dual union all
  9  select 'card' n,   2 id from dual union all
 10  select 'elimpion', 2 id from dual)
 11  select min(n),id from t where n in ('card','pan')
 12* group by id having count(distinct n)=2
SQL> /

MIN(N)           ID
-------- ----------
card              1
card              0
...
Рейтинг: 0 / 0
28.03.2019, 17:54
    #39793215
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Stax
Код: plsql
1.
min(n)

А остальные столбцы будешь заворачивать в более витиеватые конструкции?
...
Рейтинг: 0 / 0
28.03.2019, 18:00
    #39793227
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
ElicА остальные столбцы будешь заворачивать в более витиеватые конструкции?

не буду, воспользуюсь 21846430

.....
stax
...
Рейтинг: 0 / 0
28.03.2019, 18:07
    #39793233
Anton_Demin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
elimpion,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with test1 as ( select 1 id , 'card' name from dual union
                select 1 id , 'pan' name from dual union
                select 1 id , 'aaa' name from dual union
                select 2 id , 'card' name from dual union
                select 2 id , 'ccc' name from dual union
                select 2 id , 'bbb' name from dual union
                select 3 id , 'card' name from dual union
                select 3 id , 'hhh' name from dual union
                select 3 id , 'eee' name from dual union
                select 3 id , 'pan' name from dual )
select t1.*
  from test1 t1, test1 t2
 where t1.name = 'card'
   and t1.id = t2.id
   and t2.name = 'pan'
...
Рейтинг: 0 / 0
28.03.2019, 18:30
    #39793248
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Elic
Код: plsql
1.
2.
3.
where level = 2
start with 'pan'
connect by id and 'card'

И еще, судя по моим попыткам, нужно дописать and prior n = 'pan', а то без этого на Stax-овских данных ловлю "ORA-01436: цикл CONNECT BY в данных пользователя".
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
with t as (
 select 'card' n,   0 id from dual union all
 select 'pan' n,    0 id from dual union all
 select 'card' n,   0 id from dual union all
 select 'pan' n,    0 id from dual union all
 select 'card' n,   1 id from dual union all
 select 'pan' n,    1 id from dual union all
 select 'Stax' n,   1 id from dual union all
 select 'card' n,   2 id from dual union all
 select 'elimpion', 2 id from dual)
select *
from t
where level = 2
start with n = 'pan'
connect by prior id = id and n = 'card' and level <= 2
--and prior n = 'pan'
;
ERROR:
ORA-01436: CONNECT BY loop in user data



no rows selected

Elapsed: 00:00:00.02
with t as (
 select 'card' n,   0 id from dual union all
 select 'pan' n,    0 id from dual union all
 select 'card' n,   0 id from dual union all
 select 'pan' n,    0 id from dual union all
 select 'card' n,   1 id from dual union all
 select 'pan' n,    1 id from dual union all
 select 'Stax' n,   1 id from dual union all
 select 'card' n,   2 id from dual union all
 select 'elimpion', 2 id from dual)
select *
from t
where level = 2
start with n = 'pan'
connect by prior id = id and n = 'card' and level <= 2
and prior n = 'pan'
;

N                ID
-------- ----------
card              0
card              0
card              0
card              0
card              1

Elapsed: 00:00:00.03
...
Рейтинг: 0 / 0
29.03.2019, 07:40
    #39793394
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
AmKadнужно дописать and prior n = 'pan'А можно мыслить и общее:
Код: plsql
1.
2.
connect by prior id = id and n = 'card'
  and prior n <> n



И встречный вопрос: много ли смысла сравнивать искомую величину с предполагаемой в следующей форме?
Код: plsql
1.
literal = column
...
Рейтинг: 0 / 0
29.03.2019, 09:07
    #39793411
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
ElicИ встречный вопрос: много ли смысла сравнивать искомую величину с предполагаемой в следующей форме?
Код: plsql
1.
literal = column

В данном примере только когда level = 2. Для общего случая только твой вариант с неравенством текущего и приора.
...
Рейтинг: 0 / 0
29.03.2019, 09:42
    #39793422
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
AmKadElicИ встречный вопрос: много ли смысла сравнивать искомую величину с предполагаемой в следующей форме?
Код: plsql
1.
literal = column

В данном примере только когда level = 2. Для общего случая только твой вариант с неравенством текущего и приора.Ты не понял отвлечённого вопроса. Сравни с человеческой формой
Код: plsql
1.
column = literal
...
Рейтинг: 0 / 0
29.03.2019, 09:53
    #39793428
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
elimpion,

если у Вас не древняя версия
то имхо ето задачка на на патерн (странно что до сих пор не предложили)

рискну
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with t as (
select 'card' n,   0 id from dual union all
select 'pan' n,    0 id from dual union all
select 'card' n,   0 id from dual union all
select 'pan' n,    0 id from dual union all
select 'card' n,   1 id from dual union all
select 'pan' n,    1 id from dual union all
select 'Stax' n,   1 id from dual union all
select 'card' n,   2 id from dual union all
select 'elimpion', 2 id from dual)
select * from t 
match_recognize (
   partition by id
   order by n desc
   all rows per match
   pattern ({-pan-} card+)
   define
      pan as n='pan',
      card as n='card'
)
--where n in ('card','pan')



ps
інтересно, where можно заставить отработать до match?

.....
stax
...
Рейтинг: 0 / 0
29.03.2019, 10:13
    #39793437
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Staxзадачка на на патернНе перебарщивай. match_recognize ориентирован на распознавание упорядоченной последовательности и суть есть аналитика. Проверка множества это банальный group by, на крайний случай коллекция.
Отсюда и логическая ошибка в твоем запросе, полагаешься на частный случай последовательности.
...
Рейтинг: 0 / 0
29.03.2019, 10:37
    #39793449
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
-2-Отсюда и логическая ошибка в твоем запросе, полагаешься на частный случай последовательности.
'card' и 'pan' константы вшиты в код
для сортировки можно заменить напр на декоде
в чем часный случай?

....
stax
...
Рейтинг: 0 / 0
29.03.2019, 10:39
    #39793451
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
-2-,

недокопипастил

в чем логическая ошибка (без учета оріентации)?

....
stax
...
Рейтинг: 0 / 0
29.03.2019, 11:08
    #39793467
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Staxінтересно, where можно заставить отработать до match?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
select 'card' n,   0 id from dual union all
select 'pan' n,    0 id from dual union all
select 'card' n,   0 id from dual union all
select 'pan' n,    0 id from dual union all
select 'card' n,   1 id from dual union all
select 'pan' n,    1 id from dual union all
select 'Stax' n,   1 id from dual union all
select 'card' n,   2 id from dual union all
select 'elimpion', 2 id from dual)
, tt as (select n, id from t where n in ('card','pan'))
...
...
Рейтинг: 0 / 0
29.03.2019, 11:09
    #39793469
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Не представляю, как можно сделать это одним обращением к таблице, поэтому вот вариант с 3мя обращениями:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with q as (
 select 'card' n,   0 id from dual union all
 select 'pan' n,    0 id from dual union all
 select 'card' n,   0 id from dual union all
 select 'pan' n,    0 id from dual union all
 select 'card' n,   1 id from dual union all
 select 'pan' n,    1 id from dual union all
 select 'Stax' n,   1 id from dual union all
 select 'card' n,   2 id from dual union all
 select 'elimpion', 2 id from dual)
, t as (select q.*, rownum as psevdo_rowid from q)

 select t.* from t
 where not exists (select 1 from t t1 where t.id = t1.id and t.n = t1.n and t.psevdo_rowid < t1.psevdo_rowid)
       and exists (select 2 from t t2 where t.id = t2.id and t2.n = 'pan' and t.n = 'card')
...
Рейтинг: 0 / 0
29.03.2019, 11:16
    #39793477
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Павел Воронцов, Dshedoo

по непонятных причинах
автор без использования подзапроса


зы
а так, я делал через exists

.....
stax
...
Рейтинг: 0 / 0
29.03.2019, 11:29
    #39793487
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Staxв чем логическая ошибкабез предфильтра последовательность может содержать оба значения, но не последовательно.
...
Рейтинг: 0 / 0
29.03.2019, 11:41
    #39793495
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
-2-Staxв чем логическая ошибкабез предфильтра последовательность может содержать оба значения, но не последовательно.
спасибо, понял

все-таки надо
order by decode(n,'pan',1,'card',2)
поленился

.....
stax
...
Рейтинг: 0 / 0
29.03.2019, 11:47
    #39793498
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
Dshedoo,
імхо, проще
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  1  with t as (
  2   select 'card' n,   0 id from dual union all
  3   select 'pan' n,    0 id from dual union all
  4   select 'card' n,   0 id from dual union all
  5   select 'pan' n,    0 id from dual union all
  6   select 'card' n,   1 id from dual union all
  7   select 'pan' n,    1 id from dual union all
  8   select 'Stax' n,   1 id from dual union all
  9   select 'card' n,   2 id from dual union all
 10   select 'elimpion', 2 id from dual)
 11  select t.* from t
 12   where n='card' and
 13*        exists (select 2 from t t2 where t.id = t2.id and t2.n = 'pan')
SQL> /

N                ID
-------- ----------
card              0
card              0
card              1



но не подходит
авторбез использования подзапроса

.....
stax
...
Рейтинг: 0 / 0
29.03.2019, 14:34
    #39793615
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
AmKadна Stax-овских данных
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with t as (
 select 'card' n,   0 id from dual union all
 select 'pan' n,    0 id from dual union all
 select 'card' n,   0 id from dual union all
 select 'pan' n,    0 id from dual union all
 select 'card' n,   1 id from dual union all
 select 'pan' n,    1 id from dual union all
 select 'Stax' n,   1 id from dual union all
 select 'card' n,   2 id from dual union all
 select 'elimpion', 2 id from dual)
select *
from t
where level = 2
start with n = 'pan'
connect by prior id = id and n = 'card' and level <= 2
and prior n = 'pan'
;

N                ID
-------- ----------
card              0
card              0
card              0
card              0
card              1


Не многовато card?
...
Рейтинг: 0 / 0
29.03.2019, 14:38
    #39793619
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск 2х записей
andrey_anonymousНе многовато card?С каждого из двух к каждому из двух - всё сходится.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск 2х записей / 25 сообщений из 35, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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