Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Поиск значения сразу в нескольких полях  [new]
Chukis
Member

Откуда:
Сообщений: 221
Подскажите, как цивильно и красиво можно решать вот такую задачу?
Есть таблица
select a1,b1,c1, a2,b2,c2 from table1

Надо выбрать только те строки, в которых трех значений из a1,b1,c1 нет в a2,b2,c2. Причем, последовательность значений в этих полях может быть разная.
3 июн 17, 07:51    [20536577]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
Elic
Member

Откуда:
Сообщений: 29980
SQL> select * from dual where cardinality(tp_int_table(1, 2, 3) multiset intersect tp_int_table(4, 5, 6)) = 0;

D
-
X

1 row selected.

SQL> select * from dual where cardinality(tp_int_table(1, 2, 3) multiset intersect tp_int_table(3, 4, 5)) = 0;

no rows selected
3 июн 17, 08:39    [20536607]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
Elic
Member

Откуда:
Сообщений: 29980
Или всех?
SQL> select * from dual where tp_int_table(1, 2, 3) <> tp_int_table(3, 2, 1);

no rows selected
3 июн 17, 08:42    [20536608]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
Chukis
Member

Откуда:
Сообщений: 221
Elic,
Ух ты, какие новые функции!!! tp_int_table и multiset intersect.
Если, честно, то не слышал про них. Надо будет почитать.)

Спасибо.
3 июн 17, 08:50    [20536612]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
Elic
Member

Откуда:
Сообщений: 29980
Chukis
Ух ты, какие новые функции!!! tp_int_table и multiset intersect.
Если, честно, то не слышал про них. Надо будет почитать.)
RTFM Multiset Operations for Nested Tables (FAQ)
3 июн 17, 09:06    [20536621]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
Chukis
Member

Откуда:
Сообщений: 221
Elic,

a tp_int_table можно использовать только в PL/SQL конструкциях?
В простом select у меня выдает invalid identifier
3 июн 17, 10:13    [20536666]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
Elic
Member

Откуда:
Сообщений: 29980
Chukis
у меня выдает invalid identifier
Видно не в коня корм...
+
SQL> DESC tp_int_table
 tp_int_table TABLE OF NUMBER(38)
4 июн 17, 06:40    [20537669]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
среди значений a1 b1 c1 есть повторения?
4 июн 17, 12:23    [20537830]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
Chukis
Member

Откуда:
Сообщений: 221
andreymx,
Нет, среди a1,b1,c1 одинаковых быть не может, кроме ситуаций, когда там null.
4 июн 17, 13:05    [20537879]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
Chukis,

А можешь примерчик дать .... уж даже интерестно стало
4 июн 17, 15:08    [20537981]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
Chukis
Member

Откуда:
Сообщений: 221
MaximaXXL,

Например:

numa b c a1b1c1
1123312
2513 32
31 345
4231123


Надо через select оставить только 2 и 3 строку
4 июн 17, 15:48    [20538006]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
Chukis,

Очень мне понравилось решение которое пердложил Elic (проверю когда бцдц на работе)

Но если по быстрому то вот пара вариантов
select * from table1
where 
not(nvl(a,-1) in (nvl(a1,-1),nvl(b1,-1),nvl(c1,-1))
and nvl(b,-1) in (nvl(a1,-1),nvl(b1,-1),nvl(c1,-1))
and nvl(c,-1) in (nvl(a1,-1),nvl(b1,-1),nvl(c1,-1))
)

и
select * from table1
where not(
    greatest(nvl(a,-1),nvl(b,-1),nvl(c,-1)) = greatest(nvl(a1,-1),nvl(b1,-1),nvl(c1,-1))
and nvl(a,-1)+nvl(b,-1)+nvl(c,-1) = nvl(a1,-1)+nvl(b1,-1)+nvl(c1,-1)
and least(nvl(a,-1),nvl(b,-1),nvl(c,-1)) = least(nvl(a1,-1),nvl(b1,-1),nvl(c1,-1))
)

это все при условии что -1 не встречается в данных иначе надо null-значение менять на что-то ..., оба запроса могут быть проще если понять что делать с null для обеих сторон
ну и так как я писал это без базы, могут быть мелкие нюансы, но должно работать
4 июн 17, 18:42    [20538191]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
stax..
Guest
Chukis,
похожая тема
Объединение столбцов

.....
stax
6 июн 17, 09:56    [20542193]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
Анпивот + лист_егг
6 июн 17, 10:58    [20542454]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
stax..
Guest
andreymx
Анпивот + лист_егг

если честно, то про лист_егг не понял

.....
stax
6 июн 17, 11:23    [20542598]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
stax..
andreymx
Анпивот + лист_егг

если честно, то про лист_егг не понял

.....
stax
with t as(
select 1 num, 1 a, 2 b, 3 c, 3 a1, 1 b1, 2 c1 from dual union all
select 2 num, 1 a, null b, 3 c, 3 a1, 1 b1, 2 c1 from dual
)
select num,
       listagg(a,  '=') within group(order by a ) a,
       listagg(a1, '=') within group(order by a1) a1
from(
select num, a, a1 from t union all
select num, b, b1 from t union all
select num, c, c1 from t
)
group by num
что-то вроде этого (+ where)
nUMAA1
11=2=31=2=3
21=31=2=3
6 июн 17, 22:56    [20545079]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
это просто пример, не в работу :)
6 июн 17, 22:57    [20545081]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
andreymx,

Я так понял Вы хотели написать так:
with t as(
select 1 num, 1 a, 2 b, 3 c, 3 a1, 1 b1, 2 c1 from dual union all
select 2 num, 1 a, null b, 3 c, 3 a1, 1 b1, 2 c1 from dual
)

select  num,
       listagg(a,  '=') within group(order by a ) a,
       listagg(a1, '=') within group(order by a1) a1
from t
UNPIVOT INCLUDE NULLS ((a,a1) for sk in ((a, a1) as 1, (b, b1) as 2, (c, c1) as 3))

group by num
6 июн 17, 23:49    [20545173]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
MaximaXXL
Member

Откуда: Киев
Сообщений: 652
и тогда можно финализировать как-то так:
select  num
from t
UNPIVOT INCLUDE NULLS ((a,a1) for sk in ((a, a1) as 1, (b, b1) as 2, (c, c1) as 3))
group by num
having listagg(a,  '=') within group(order by a ) != listagg(a1, '=') within group(order by a1)


Но все равно автором темы не раскрыто поведение с null
7 июн 17, 09:30    [20545576]     Ответить | Цитировать Сообщить модератору
 Re: Поиск значения сразу в нескольких полях  [new]
trace.log
Guest
MaximaXXL,

автор переваривает ответы
7 июн 17, 09:34    [20545589]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить