powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Неоднозначное условие
8 сообщений из 8, страница 1 из 1
Неоднозначное условие
    #39581568
Фотография Foxter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Снова запутался в трех соснах (( Может быть кому - то будет интересно найти оптимальное решение (ну и мне помочь заодно )) )?
Есть две выборки. У обоих есть 2 идентификатора - fid (first id) и sid (second id).

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with 
t as  (select 1 a, 22 sid, 18 fid from dual),
ns as (select 22 fid, 17 sid from dual union all select 22, 18 from dual union all select 22, 19 from dual union all select 22, null from dual)
select 
* 
from 
ns, t
where 
(t.fid = ns.fid or t.sid = ns.sid)



Сейчас запрос возвращает все совпадения между этими выборками при совпадении id. Можно ли построить условие, при котором будет возвращаться лишь одна запись (при совпадении fid: 18 по 1 записи в обоих выборках), а совпадение по sid в этом случае игнорироваться? А если не найдено совпадение по fid, тогда выбирать все записи с совпавшим sid?
...
Рейтинг: 0 / 0
Неоднозначное условие
    #39581577
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxter,

order by case ...
fetch first 1 rows with ties
...
Рейтинг: 0 / 0
Неоднозначное условие
    #39581595
Фотография Foxter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

Сделал вроде все по https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 with 
t as  (select 1 a, 22 fid, 18 sid from dual),
ns as (select 22 fid, 17 sid from dual union all select 22, 18 from dual union all select 22, 19 from dual union all select 22, null from dual)
select 
 * 
from 
ns, t
where 
(t.fid = ns.fid or t.sid = ns.sid)
order by case when t.fid = ns.sid then 1 else 2 end
fetch first 1 rows with ties



Но ошибка в выражении. Не могу понять где. Не поправите?
...
Рейтинг: 0 / 0
Неоднозначное условие
    #39581598
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxterНе могу понять гдеВ пятой строке.
...
Рейтинг: 0 / 0
Неоднозначное условие
    #39581608
Фотография Foxter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-FoxterНе могу понять гдеВ пятой строке. )))

* => ns.* ? - Даже, если указывать однозначно
...
Рейтинг: 0 / 0
Неоднозначное условие
    #39581615
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Foxter,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with 
t as  (select 1 a, 22 fid, 18 sid from dual),
ns as (select 22 fid, 17 sid from dual union all 
       select 22, 18 from dual union all 
       select 22, 19 from dual union all 
       select 22, null from dual
      )
select * 
from t
    ,lateral(
       select *
       from ns
       where 
         t.fid = ns.fid or t.sid = ns.sid
       order by case when t.fid = ns.sid then 1 else 2 end
       fetch first 1 rows only
     ) v;
...
Рейтинг: 0 / 0
Неоднозначное условие
    #39581633
Фотография Foxter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender, спасибо

Но у меня, почему - то в обоих запросах (в моем выше) и Вашем - Неверное завершение SQL выражения, в SQL Developer. Попробовал на livesql.oracle.com - отработало. Видимо версия старая. Ну чтож, спасибо всем. Вы мне очень помогли.
...
Рейтинг: 0 / 0
Неоднозначное условие
    #39581644
Фотография Foxter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал "по старинке" следующим образом (пример для 2 строк)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with 
t as  (select 1 a, 22 fid, 18 sid from dual union all select 3 a, 22 fid, 18 sid from dual),
ns as (select 22 fid, 17 sid from dual union all select 22, 18 from dual union all select 22, 19 from dual union all select 22, null from dual)
select * from    
    (select 
     t.a, t.fid, t.sid, row_number() over (partition by t.a order by t.a) rn
    from 
    ns, t
    where 
    (t.fid = ns.fid or t.sid = ns.sid))
where rn = 1



Думаю, что этот вариант удовлетворяет поставленным условиям...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Неоднозначное условие
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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