powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Поиск 2х записей
25 сообщений из 35, страница 1 из 2
Поиск 2х записей
    #39793173
elimpion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, можно ли без использования выполнить этот запрос без использования подзапроса
Код: 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
Поиск 2х записей
    #39793175
elimpion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
*можно ли выполнить этот запрос без использования подзапроса
...
Рейтинг: 0 / 0
Поиск 2х записей
    #39793181
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
elimpion,

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

Тебе SY уже приводил пример.
с использованием LAG?
...
Рейтинг: 0 / 0
Поиск 2х записей
    #39793190
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
where level = 2
start with 'pan'
connect by id and 'card'
...
Рейтинг: 0 / 0
Поиск 2х записей
    #39793197
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Поиск 2х записей
    #39793215
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Код: plsql
1.
min(n)

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

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

.....
stax
...
Рейтинг: 0 / 0
Поиск 2х записей
    #39793233
Фотография Anton_Demin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Поиск 2х записей
    #39793248
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Поиск 2х записей
    #39793394
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Поиск 2х записей
    #39793411
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicИ встречный вопрос: много ли смысла сравнивать искомую величину с предполагаемой в следующей форме?
Код: plsql
1.
literal = column

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

В данном примере только когда level = 2. Для общего случая только твой вариант с неравенством текущего и приора.Ты не понял отвлечённого вопроса. Сравни с человеческой формой
Код: plsql
1.
column = literal
...
Рейтинг: 0 / 0
Поиск 2х записей
    #39793428
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Поиск 2х записей
    #39793437
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxзадачка на на патернНе перебарщивай. match_recognize ориентирован на распознавание упорядоченной последовательности и суть есть аналитика. Проверка множества это банальный group by, на крайний случай коллекция.
Отсюда и логическая ошибка в твоем запросе, полагаешься на частный случай последовательности.
...
Рейтинг: 0 / 0
Поиск 2х записей
    #39793449
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Отсюда и логическая ошибка в твоем запросе, полагаешься на частный случай последовательности.
'card' и 'pan' константы вшиты в код
для сортировки можно заменить напр на декоде
в чем часный случай?

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

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

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

....
stax
...
Рейтинг: 0 / 0
Поиск 2х записей
    #39793467
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Поиск 2х записей
    #39793469
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не представляю, как можно сделать это одним обращением к таблице, поэтому вот вариант с 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
Поиск 2х записей
    #39793477
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Воронцов, Dshedoo

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


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

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

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

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


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