Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Неоднозначное условие / 8 сообщений из 8, страница 1 из 1
10.01.2018, 11:05
    #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
10.01.2018, 11:15
    #39581577
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначное условие
Foxter,

order by case ...
fetch first 1 rows with ties
...
Рейтинг: 0 / 0
10.01.2018, 11:32
    #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
10.01.2018, 11:37
    #39581598
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначное условие
FoxterНе могу понять гдеВ пятой строке.
...
Рейтинг: 0 / 0
10.01.2018, 11:44
    #39581608
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначное условие
-2-FoxterНе могу понять гдеВ пятой строке. )))

* => ns.* ? - Даже, если указывать однозначно
...
Рейтинг: 0 / 0
10.01.2018, 11:53
    #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
10.01.2018, 12:05
    #39581633
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неоднозначное условие
xtender, спасибо

Но у меня, почему - то в обоих запросах (в моем выше) и Вашем - Неверное завершение SQL выражения, в SQL Developer. Попробовал на livesql.oracle.com - отработало. Видимо версия старая. Ну чтож, спасибо всем. Вы мне очень помогли.
...
Рейтинг: 0 / 0
10.01.2018, 12:19
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Неоднозначное условие / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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