Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / задачка (можно ли как-то иначе) / 25 сообщений из 27, страница 1 из 2
31.08.2017, 11:19
    #39513265
инфера
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
есть данные типа

table1

f1 f21 a2 b3 c

table2

f1 f21 b2 c3 c2 b4 e

надо выбрать такие записи table2 где одно поле из значений которые есть в table1, а второе нет (не оба)

решение влоб

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select f1, f2
from
(
select f1,f2
from table1
minus
select f1,f2
from table2
)
where 
f1 in (select f1 from table1)
and
f2 in (select f2 from table1)



но это капец как громоздко
есть ощущение что должно быть решение проще и лучше
че-то я туплю, вобщем, помогите

ожидаемый релзультат

f1 f21 b2 c
...
Рейтинг: 0 / 0
31.08.2017, 11:24
    #39513269
инфера
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфера
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select f1, f2
from
(
select f1,f2
from table1
minus
select f1,f2
from table2
)
where 
f1 in (select f1 from table1)
and
f2 in (select f2 from table1)




сорри, запрос неправильный
можете не смотреть
...
Рейтинг: 0 / 0
31.08.2017, 11:25
    #39513270
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфера,

тебе нужны значения, которые существуют и не существуют.
...
Рейтинг: 0 / 0
31.08.2017, 11:28
    #39513272
инфера
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инферасорри, запрос неправильный
можете не смотреть

Код: 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.
вот так результат правильный

[SRC oracle]with t1(f1, f2) as
(
select 1, 'a' from dual union all
select 2, 'b' from dual union all
select 3, 'c' from dual
)
,t2(f1, f2) as
(
select 1, 'b' from dual union all
select 2, 'c' from dual union all
select 3, 'c' from dual union all
select 2, 'b' from dual union all
select 4, 'e' from dual
)
 select f1, f2
from
(
  select f1,f2
  from t2
  minus
  select f1,f2
  from t1
)
where 
f1 in (select f1 from t1)
and
f2 in (select f2 from t1) 


[/SRC]
...
Рейтинг: 0 / 0
31.08.2017, 11:31
    #39513277
инфера
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
boobyинфера,

тебе нужны значения, которые существуют и не существуют.

существует одно из двух (не 2 и не 0), любое
множества значений не пересекаются, не может быть пар [1, 1] или [b, c]
...
Рейтинг: 0 / 0
31.08.2017, 11:33
    #39513283
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфера,

не понял, кого и где нет, назовите поля в табличках по разному и легче будет описать что надо

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  1  with t1 (f1,f2) as (
  2  select 1,   'a' from dual union all
  3  select 2,   'b' from dual union all
  4  select 3,   'c' from dual)
  5  ,t2 (f1, f2) as (
  6  select 1,   'b' from dual union all
  7  select 2,   'c' from dual union all
  8  select 3,   'c' from dual union all
  9  select 2,   'b' from dual union all
 10  select 4,   'e'from dual)
 11  select t2.* from t2,t1 --distinct ???
 12* where t2.f1=t1.f1 and t2.f2<>t1.f2
 13  /

        F1 F
---------- -
         1 b
         2 c




.....
stax
...
Рейтинг: 0 / 0
31.08.2017, 11:34
    #39513284
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфера,

Типа так?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with table1 as (select 1 f1, 'a' f2 from dual union all
select 2 f1, 'b' f2 from dual union all
select 3 f1, 'c' f2 from dual)
,table2 as (select 1 f1, 'b' f2 from dual union all
select 2 f1, 'c' f2 from dual union all
select 3 f1, 'c' f2 from dual union all
select 2 f1, 'b' f2 from dual union all
select 4 f1, 'e' f2 from dual)

select t2.* from table1 t1, table2 t2
where t1.f1 = t2.f1
and t1.f2 != t2.f2
...
Рейтинг: 0 / 0
31.08.2017, 11:39
    #39513289
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфера
Код: plsql
1.
вот так результат правильный

(4,a)?
...
Рейтинг: 0 / 0
31.08.2017, 11:39
    #39513290
Озо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфера,

not exists where f1=f1 and f2=f2
and (exists where f1=f1
or exists where f2=f2)
...
Рейтинг: 0 / 0
31.08.2017, 11:42
    #39513292
Landgraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
With Table1 as
       (select 1 as f1, 'a' as f2 from dual
        union
        select 2 as f1, 'b' as f2 from dual
        union
        select 3 as f1, 'c' as f2 from dual),
      Table2 as
        (select 1 as f1, 'b' as f2 from dual
        union
        select 2 as f1, 'c' as f2 from dual
        union
        select 3 as f1, 'c' as f2 from dual 
        union
        select 2 as f1, 'b' as f2 from dual
        union
        select 4 as f1, 'e' as f2 from dual) 
        
select * from Table2 T2
       where exists (select * from Table1 T1 where T1.f1 = T2.f1 and T1.f2<>T2.f2)
          
...
Рейтинг: 0 / 0
31.08.2017, 11:44
    #39513296
Озо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
Elic,

И откуда же такое, при условии
авторнадо выбрать такие записи table2
...
Рейтинг: 0 / 0
31.08.2017, 12:03
    #39513327
инфера
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
MaximaXXLинфера,

Типа так?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with table1 as (select 1 f1, 'a' f2 from dual union all
select 2 f1, 'b' f2 from dual union all
select 3 f1, 'c' f2 from dual)
,table2 as (select 1 f1, 'b' f2 from dual union all
select 2 f1, 'c' f2 from dual union all
select 3 f1, 'c' f2 from dual union all
select 2 f1, 'b' f2 from dual union all
select 4 f1, 'e' f2 from dual)

select t2.* from table1 t1, table2 t2
where t1.f1 = t2.f1
and t1.f2 != t2.f2



не работает если чуток добавить данных

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t1(f1, f2) as
(
select 1, 'a' from dual union all
select 2, 'b' from dual union all
select 2, 'x' from dual union all -- вот
select 3, 'c' from dual
)
....



а также должно работать в обе стороны
а не только t1.f2 != t2.f2
...
Рейтинг: 0 / 0
31.08.2017, 12:09
    #39513338
инфера
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
Landgraf
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
With Table1 as
       (select 1 as f1, 'a' as f2 from dual
        union
        select 2 as f1, 'b' as f2 from dual
        union
        select 3 as f1, 'c' as f2 from dual),
      Table2 as
        (select 1 as f1, 'b' as f2 from dual
        union
        select 2 as f1, 'c' as f2 from dual
        union
        select 3 as f1, 'c' as f2 from dual 
        union
        select 2 as f1, 'b' as f2 from dual
        union
        select 4 as f1, 'e' as f2 from dual) 
        
select * from Table2 T2
       where exists (select * from Table1 T1 where T1.f1 = T2.f1 and T1.f2<>T2.f2)
          



возвращает [2, b], чего не должно быть, т.к. [2, b] в обоих таблицах
...
Рейтинг: 0 / 0
31.08.2017, 12:19
    #39513350
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфера,

так я и не понял, ни чего ты ищешь, ни какого другого тебе надо.
Если твой второй запрос правильный, то вот он же "другой"

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with t1(f1, f2) as
( 
select  1 f1, 'a' f2 from dual union all
select 2, 'b' from dual union all
select 3, 'c' from dual
)
,t2(f1, f2) as
( 
select  1 f1, 'b' f2 from dual union all
select 2, 'c' from dual union all
select 3, 'c' from dual union all
select 2, 'b' from dual union all
select 4, 'e' from dual
)
select t2.f1, t2.f2
From t2, t1, t1 t3
Where 
t2.f1=t1.f1 And t2.f2=t3.f2
minus 
Select f1,f2 from t1
...
Рейтинг: 0 / 0
31.08.2017, 12:21
    #39513351
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфера,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  1  with t1 (g1,g2) as (
  2  select 1,   'a' from dual union all
  3  select 2,   'b' from dual union all
  4  select 3,   'c' from dual)
  5  ,t2 (f1, f2) as (
  6  select 1,   'b' from dual union all
  7  select 2,   'a' from dual union all
  8  select 2,   'c' from dual union all
  9  select 2,   'b' from dual union all
 10  select 3,   'c' from dual union all
 11  select 5,   'a' from dual union all
 12  select 4,   'e'from dual)
 13  select t2.* from t2
 14* where exists (select 1 from t1 where (g1=f1 or g2=f2) and (g1<>f1 or g2<>f2))
SQL> /

        F1 F
---------- -
         1 b
         2 a
         2 c
         5 a




.....
stax
...
Рейтинг: 0 / 0
31.08.2017, 12:30
    #39513362
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with t1(f1, f2) as
( 
select  1 f1, 'a' f2 from dual union all
select 2, 'b' from dual union all
select 3, 'c' from dual
)
,t2(f1, f2) as
( 
select  1 f1, 'b' f2 from dual union all
select 2, 'c' from dual union all
select 3, 'c' from dual union all
select 2, 'b' from dual union all
select 4, 'e' from dual
)
,t3 as (select f1,f2 from t2
minus
select f1,f2 from t1)
select f1,f2 from t3
where f1 in (select distinct f1 from t1)
or f2 in (select distinct f2 from t1)

?
...
Рейтинг: 0 / 0
31.08.2017, 12:32
    #39513363
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
booby,
я так понимаю
select 2, 'х' from dual union all

должен в выборку попадать

.....
stax
...
Рейтинг: 0 / 0
31.08.2017, 12:41
    #39513371
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
Stax,

предлагается верить 20761162
согласно которому t1 :
а) определяет множество допустимых значений для f1
б) определяет множество допустимых значений для f2
в) определяет множество запрещенных пар (f1,f2)

(там же настаивается на том, что отобранные пары должны оказаться реляционным отношением (distinct))
...
Рейтинг: 0 / 0
31.08.2017, 12:56
    #39513384
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
booby,

понял, ето если исходить "вот так результат правильный"


более запутано, но "за один проход", если в т2 дубли + distinct

Код: 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 t1 (g1,g2) as (
 select 0,   'a' from dual union all
 select 1,   'a' from dual union all
 select 2,   'b' from dual union all
 select 3,   'c' from dual)
,t2 (f1, f2) as (
 select 1,   'b' from dual union all
 select 2,   'a' from dual union all
 select 2,   'c' from dual union all
 select 2,   'x' from dual union all
 select 2,   'b' from dual union all
 select 3,   'c' from dual union all
 select 5,   'a' from dual union all
 select 4,   'e'from dual)
select t2.* from t2
where (select count(distinct decode(g1,f1,g1))+ count(distinct decode(g2,f2,g2))
       from t1 where (g1=f1 or g2=f2) and (g1<>f1 or g2<>f2))>1

SQL> /

        F1 F
---------- -
         1 b
         2 a
         2 c




......
stax
...
Рейтинг: 0 / 0
31.08.2017, 13:22
    #39513414
инфера
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
Staxbooby,

понял, ето если исходить "вот так результат правильный"


более запутано, но "за один проход", если в т2 дубли + distinct

Код: 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 t1 (g1,g2) as (
 select 0,   'a' from dual union all
 select 1,   'a' from dual union all
 select 2,   'b' from dual union all
 select 3,   'c' from dual)
,t2 (f1, f2) as (
 select 1,   'b' from dual union all
 select 2,   'a' from dual union all
 select 2,   'c' from dual union all
 select 2,   'x' from dual union all
 select 2,   'b' from dual union all
 select 3,   'c' from dual union all
 select 5,   'a' from dual union all
 select 4,   'e'from dual)
select t2.* from t2
where (select count(distinct decode(g1,f1,g1))+ count(distinct decode(g2,f2,g2))
       from t1 where (g1=f1 or g2=f2) and (g1<>f1 or g2<>f2))>1

SQL> /

        F1 F
---------- -
         1 b
         2 a
         2 c




......
stax

спасибо
это работает
мне не удалось найти данных на которых были бы проблемы
...
Рейтинг: 0 / 0
31.08.2017, 14:02
    #39513451
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфераспасибо
это работает
мне не удалось найти данных на которых были бы проблемы


у меня более запутано чем у booby

чутку изменил (подправил)
Код: 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.
  1  with t1(f1, f2) as
  2  (
  3  select  0 f1, 'a' f2 from dual union all
  4  select  1 f1, 'a' f2 from dual union all
  5  select 2, 'b' from dual union all
  6  select 3, 'c' from dual
  7  )
  8  ,t2(f1, f2) as
  9  (
 10  select  1 f1, 'b' f2 from dual union all
 11  select 2, 'a' from dual union all
 12  select 2, 'b' from dual union all
 13  select 2, 'c' from dual union all
 14  select 2, 'x' from dual union all
 15  select 3, 'c' from dual union all
 16  select 5, 'a' from dual union all
 17  select 4, 'e' from dual
 18  )
 19  select distinct t2.f1, t2.f2
 20  From t2, t1, t1 t3
 21  Where
 22* t2.f1=t1.f1 And t2.f2=t3.f2 and (t1.f1<>t3.f1 or t1.f2<>t3.f2)
SQL> /

        F1 F
---------- -
         1 b
         2 c
         2 a
...
Рейтинг: 0 / 0
31.08.2017, 14:35
    #39513473
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
Stax,
красиво крестишь.
Но в скобках, сдается, and должен быть в таком случае.
...
Рейтинг: 0 / 0
31.08.2017, 14:47
    #39513478
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
boobyStax,
красиво крестишь.
Но в скобках, сдается, and должен быть в таком случае.

да вроде нет
t2.f1=t1.f1 And t2.f2=t3.f2 and NOT (t1.f1=t3.f1 and t1.f2=t3.f2)

t1.f1=t3.f1 and t1.f2=t3.f2 совпадение строк
(можно было ровиды сравнить (<>), но во вюшке rowida нет)

.....
stax
...
Рейтинг: 0 / 0
31.08.2017, 23:29
    #39513738
задачка (можно ли как-то иначе)
Staxинфераспасибо
это работает
мне не удалось найти данных на которых были бы проблемы


у меня более запутано чем у booby

чутку изменил (подправил)
Код: 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.
  1  with t1(f1, f2) as
  2  (
  3  select  0 f1, 'a' f2 from dual union all
  4  select  1 f1, 'a' f2 from dual union all
  5  select 2, 'b' from dual union all
  6  select 3, 'c' from dual
  7  )
  8  ,t2(f1, f2) as
  9  (
 10  select  1 f1, 'b' f2 from dual union all
 11  select 2, 'a' from dual union all
 12  select 2, 'b' from dual union all
 13  select 2, 'c' from dual union all
 14  select 2, 'x' from dual union all
 15  select 3, 'c' from dual union all
 16  select 5, 'a' from dual union all
 17  select 4, 'e' from dual
 18  )
 19  select distinct t2.f1, t2.f2
 20  From t2, t1, t1 t3
 21  Where
 22* t2.f1=t1.f1 And t2.f2=t3.f2 and (t1.f1<>t3.f1 or t1.f2<>t3.f2)
SQL> /

        F1 F
---------- -
         1 b
         2 c
         2 a


А может просто вот так
---- тут те же данные что и у вас with t1(f1, f2) as ........

select distinct t2.f1, t2.f2
From t2
join t1 on t1.f1=t2.f1 and t1.f2<>t2.f2;
...
Рейтинг: 0 / 0
31.08.2017, 23:36
    #39513741
пылинище
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
задачка (можно ли как-то иначе)
инфераStaxbooby,

понял, ето если исходить "вот так результат правильный"


более запутано, но "за один проход", если в т2 дубли + distinct

Код: 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 t1 (g1,g2) as (
 select 0,   'a' from dual union all
 select 1,   'a' from dual union all
 select 2,   'b' from dual union all
 select 3,   'c' from dual)
,t2 (f1, f2) as (
 select 1,   'b' from dual union all
 select 2,   'a' from dual union all
 select 2,   'c' from dual union all
 select 2,   'x' from dual union all
 select 2,   'b' from dual union all
 select 3,   'c' from dual union all
 select 5,   'a' from dual union all
 select 4,   'e'from dual)
select t2.* from t2
where (select count(distinct decode(g1,f1,g1))+ count(distinct decode(g2,f2,g2))
       from t1 where (g1=f1 or g2=f2) and (g1<>f1 or g2<>f2))>1

SQL> /

        F1 F
---------- -
         1 b
         2 a
         2 c




......
stax

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


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