powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос на выборку из таблицы если чего то нет в другой таблице
10 сообщений из 10, страница 1 из 1
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107864
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как лучше написать такой запрос:

Есть таблица T1 (F0,F1,F2,F3)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
F0  F1  F2  F3
---------------
1   A   22  33
2   A   22  33
3   A   22  33
1   B   24  35
2   B   24  35
3   B   24  35
4   B   24  35
5   B   24  35
1   С   26  31
2   С   26  31


Есть таблица T2 (F0):

Код: sql
1.
2.
3.
4.
5.
6.
7.
F0
--
1
2
3
4
5


Нужно вывести все строки из T1, сруппированные по полям F1,F2,F3 если для группы нет строки из T2 по полю F0.

т.е. для данного примера нужно вывести следующее:

Код: sql
1.
2.
3.
4.
5.
6.
7.
F0  F1  F2  F3
---------------
1   A   22  33
2   A   22  33
3   A   22  33
1   С   26  31
2   С   26  31


не выводим группу:

Код: sql
1.
2.
3.
4.
5.
6.
7.
F0  F1  F2  F3
---------------
1   B   24  35
2   B   24  35
3   B   24  35
4   B   24  35
5   B   24  35


потому что все 5 есть в T2
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107869
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
сруппированные по полям F1,F2,F3 если для группы нет строки из T2 по полю F0.

Код: 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.
SQL> with T1 (F0,F1,F2,F3) as( select 1, 'A', 22, 33
  2        from dual union all select 2, 'A', 22, 33
  3        from dual union all select 3, 'A', 22, 33
  4        from dual union all select 1, 'B', 24, 35
  5        from dual union all select 2, 'B', 24, 35
  6        from dual union all select 3, 'B', 24, 35
  7        from dual union all select 4, 'B', 24, 35
  8        from dual union all select 5, 'B', 24, 35
  9        from dual union all select 1, 'С', 26, 31
 10        from dual union all select 2, 'С', 26, 31
 11        from dual
 12  ),T2 (F0) as( select 1
 13  from dual union all select 2
 14  from dual union all select 3
 15  from dual union all select 4
 16  from dual union all select 5
 17  from dual
 18  )
 19  select f1, f2, f3
 20    from t1
 21   group by f1, f2, f3
 22   having (cast(multiset(select f0 from t2) as sys.ORA_MINING_NUMBER_NT) multiset except distinct cast(collect(f0) as sys.ORA_MINING_NUMBER_NT)) is not empty
 23  ;

F1         F2         F3
-- ---------- ----------
A          22         33
С          26         31

SQL> 
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107871
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Спасибо!

Чуть только добавлю:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select a.*
   from t1 a,
   (
    select f1, f2, f3
    from t1
    group by f1, f2, f3
    having (cast(multiset(select f0 from t2) as sys.ORA_MINING_NUMBER_NT) multiset except distinct cast(collect(f0) as sys.ORA_MINING_NUMBER_NT)) is not empty
   ) r
   where a.f1=r.f1 and a.f2=r.f2 and a.f3=r.f3



Но, к сожалению, я всё перепутал, надо не для Oracle, а для MSSQL

Сейчас создам такую же тему в MSSQL
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107873
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
Чуть только добавлю:

Вы уж терминологию-то подтяните.
Сгруппированные вам строки нужны или нет.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> with 
...
 19  , tt as(
 20  select f1, f2, f3
 21       , cast(collect(f0) as sys.ORA_MINING_NUMBER_NT) f0_col
 22    from t1
 23   group by f1, f2, f3
 24   having (cast(multiset(select f0 from t2) as sys.ORA_MINING_NUMBER_NT) multiset except distinct cast(collect(f0) as sys.ORA_MINING_NUMBER_NT)) is not empty
 25  )
 26  select cf0.column_value f0, tt.f1, tt.f2, tt.f3
 27    from tt, table(tt.f0_col) cf0
 28  ;

        F0 F1         F2         F3
---------- -- ---------- ----------
         1 A          22         33
         3 A          22         33
         2 A          22         33
         1 С          26         31
         2 С          26         31

SQL> 
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107883
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

а если не такими специфичными только для оракла средствами?
если бы простым SQL можно было бы повторить то же самое, то было бы просто супер.
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107886
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
andrey_anonymous,

а если не такими специфичными только для оракла средствами?
если бы простым SQL можно было бы повторить то же самое, то было бы просто супер.

"простым sql" эта тема зовётся "реляционным делением".
Просто спросите гугл или яндекс.
Иногда возникают специфические для системы решения, одно из которых показано.
Другое специфическое, для более свежих версий Oracle, может выглядеть таком примерно стиле:
Код: 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.
with T1 (F0,F1,F2,F3) as( select 1, 'A', 22, 33
         from dual union all select 2, 'A', 22, 33
         from dual union all select 3, 'A', 22, 33
         from dual union all select 1, 'B', 24, 35
         from dual union all select 2, 'B', 24, 35
         from dual union all select 3, 'B', 24, 35
         from dual union all select 4, 'B', 24, 35
         from dual union all select 5, 'B', 24, 35
         from dual union all select 1, 'С', 26, 31
         from dual union all select 2, 'С', 26, 31
         from dual
   ),T2 (F0) as( select 1
   from dual union all select 2
   from dual union all select 3
   from dual union all select 4
   from dual union all select 5
   from dual
   )
Select * From T1
Where (f1,f2,f3) in (
          Select 
            F1,F2,F3
          From T1
          Group by F1,F2,F3
          Having to_char(bitmap_construct_agg(bitmap_bit_position(f0))) != (Select to_char(bitmap_construct_agg(bitmap_bit_position(f0))) from T2)
)


(Эх, мне бы что-то такое для версий помладше... не пришлось бы не так давно самоделку на эту тему писать...)

Для ms sql есть тонны многостраничных статей с разбором производительности вариантов.
Классических решений, независимых от версии sql обычно упоминают три.
поищите и найдете, в том числе на sql.ru во множественном числе.
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107888
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter

а если не такими специфичными только для оракла средствами?
если бы простым SQL можно было бы повторить то же самое, то было бы просто супер.


Код: 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.
with T1 (F0,F1,F2,F3) as( select 1, 'A', 22, 33
      from dual union all select 2, 'A', 22, 33
      from dual union all select 3, 'A', 22, 33
      from dual union all select 1, 'B', 24, 35
      from dual union all select 2, 'B', 24, 35
      from dual union all select 3, 'B', 24, 35
      from dual union all select 4, 'B', 24, 35
      from dual union all select 5, 'B', 24, 35
      from dual union all select 1, 'C', 26, 31
      from dual union all select 2, 'C', 26, 31
      from dual
),T2 (F0) as( select 1
from dual union all select 2
from dual union all select 3
from dual union all select 4
from dual union all select 5
from dual
)
select  t1.f1,
        t1.f2,
        t1.f3
  from      t1
          partition by(
                       t1.f1,
                       t1.f2,
                       t1.f3
                      )
        right join
            t2
          on t2.f0 = t1.f0
  group by t1.f1,
           t1.f2,
           t1.f3
  having count(t1.f0) != count(t2.f0)
/

F         F2         F3
- ---------- ----------
A         22         33
C         26         31

SQL>



SY.
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107892
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.
with T1 (F0,F1,F2,F3) as( select 1, 'A', 22, 33
         from dual union all select 2, 'A', 22, 33
         from dual union all select 3, 'A', 22, 33
         from dual union all select 1, 'B', 24, 35
         from dual union all select 2, 'B', 24, 35
         from dual union all select 3, 'B', 24, 35
         from dual union all select 4, 'B', 24, 35
         from dual union all select 5, 'B', 24, 35
         from dual union all select 1, 'С', 26, 31
         from dual union all select 2, 'С', 26, 31
         from dual
   ),T2 (F0) as( select 1
   from dual union all select 2
   from dual union all select 3
   from dual union all select 4
   from dual union all select 5
   from dual
   )
Select * From T1
Where (f1,f2,f3) in (
Select 
F1,F2,F3
From T1
Where Not Exists(Select Null From T2 Where T2.f0= T1.f0)
);
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107896
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.
with T1 (F0,F1,F2,F3) as( select 1, 'A', 22, 33
         from dual union all select 2, 'A', 22, 33
         from dual union all select 3, 'A', 22, 33
         from dual union all select 1, 'B', 24, 35
         from dual union all select 2, 'B', 24, 35
         from dual union all select 3, 'B', 24, 35
         from dual union all select 4, 'B', 24, 35
         from dual union all select 5, 'B', 24, 35
         from dual union all select 1, 'С', 26, 31
         from dual union all select 2, 'С', 26, 31
         from dual
   ),T2 (F0) as( select 1
   from dual union all select 2
   from dual union all select 3
   from dual union all select 4
   from dual union all select 5
   from dual
   )
Select * From T1 
Where 
  Exists(
    Select Null
    From ( 
    Select T2.F0,T1.F1,T1.F2,T1.F3 From T2, T1 
    minus --< в T-SQL здесь except
    Select F0,F1,F2,F3 From T1     
    ) D
    Where D.F1 = T1.F1 And D.F2 = T1.F2 And D.F3 = T1.F3
  )
...
Рейтинг: 0 / 0
Запрос на выборку из таблицы если чего то нет в другой таблице
    #40107908
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо! То что нужно.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос на выборку из таблицы если чего то нет в другой таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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