Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / найти записи которым есть соответствие / 13 сообщений из 13, страница 1 из 1
31.01.2022, 17:23
    #40130808
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
есть две таблицы, например группа товаров со столбцами название и ИД, и вторая типы товаров, со столбцами ИД, название типа, и ИД группы. Как мне сделать выборку групп у которых имеются товары, по идее это INNER JOIN который отфильтрует все пувстые группы но он мне выдаст в случае если у группы два и более товаров несколько строк с названием группы.

в запросе мне надо запросить только список названий групп и их ИД
...
Рейтинг: 0 / 0
31.01.2022, 17:30
    #40130809
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
kmskmskms,

А в чем отличие от 22401192 ?
Раздел "Работа" не предлагать ?
...
Рейтинг: 0 / 0
31.01.2022, 17:41
    #40130813
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
kmskmskms
есть две таблицы, например группа товаров со столбцами название и ИД, и вторая типы товаров, со столбцами ИД, название типа, и ИД группы. Как мне сделать выборку групп у которых имеются товары, по идее это INNER JOIN который отфильтрует все пувстые группы но он мне выдаст в случае если у группы два и более товаров несколько строк с названием группы.

в запросе мне надо запросить только список названий групп и их ИД


по идее тут никаких JOINов (разве что типы товаров могут принадлежать к несуществующей группе товаров):

Код: plsql
1.
2.
3.
SELECT  DISTINCT GROUP_ID
  FROM  PRODUCT_TYPES
/



Ну a если типы товаров моvут принадлежать к несуществующей группе товаров (плохой дизайн):

Код: plsql
1.
2.
3.
4.
5.
6.
 SELECT  GROUP_ID
   FROM  PRODUCT_TYPES
INTERSECT
 SELECT  GROUP_ID
   FROM  PRODUCT_GROUPS
/



Или:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT  GROUP_ID
  FROM  PRODUCT_GROUPS
  WHERE GROUP_ID IN (
                     SELECT  GROUP_ID
                       FROM  PRODUCT_TYPES
                    )
/



SY.
...
Рейтинг: 0 / 0
31.01.2022, 17:53
    #40130818
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
kmskmskms
есть две таблицы, например группа товаров со столбцами название и ИД, и вторая типы товаров, со столбцами ИД, название типа, и ИД группы. Как мне сделать выборку групп у которых имеются товары, по идее это INNER JOIN который отфильтрует все пувстые группы но он мне выдаст в случае если у группы два и более товаров несколько строк с названием группы.

в запросе мне надо запросить только список названий групп и их ИД


Как мне сделать выборку групп у которых имеются типы товаров?

ps
select * from группа товаров t1
where exists (select 1 from типы товаров t2 where t2.ИД группы=t1.ИД)

.....
stax
...
Рейтинг: 0 / 0
01.02.2022, 08:36
    #40130929
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
Stax, да, это будет работать но это очень плохой дизайн на каждую строку в выборке делать подзапрос where exists (SELECT ...), такие запросы работают медленно, проверено. У SY последний пример тоже плох, с подзапросом на каждую запись
...
Рейтинг: 0 / 0
01.02.2022, 08:44
    #40130933
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
SY
kmskmskms
есть две таблицы, например группа товаров со столбцами название и ИД, и вторая типы товаров, со столбцами ИД, название типа, и ИД группы. Как мне сделать выборку групп у которых имеются товары, по идее это INNER JOIN который отфильтрует все пувстые группы но он мне выдаст в случае если у группы два и более товаров несколько строк с названием группы.

в запросе мне надо запросить только список названий групп и их ИД


по идее тут никаких JOINов (разве что типы товаров могут принадлежать к несуществующей группе товаров):

Код: plsql
1.
2.
3.
SELECT  DISTINCT GROUP_ID
  FROM  PRODUCT_TYPES
/



Ну a если типы товаров моvут принадлежать к несуществующей группе товаров (плохой дизайн):

Код: plsql
1.
2.
3.
4.
5.
6.
 SELECT  GROUP_ID
   FROM  PRODUCT_TYPES
INTERSECT
 SELECT  GROUP_ID
   FROM  PRODUCT_GROUPS
/



Или:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
SELECT  GROUP_ID
  FROM  PRODUCT_GROUPS
  WHERE GROUP_ID IN (
                     SELECT  GROUP_ID
                       FROM  PRODUCT_TYPES
                    )
/



SY.


Вот в последнем запросе возможно JOIN будет лучшим решением.
Но многое зависит от размера PRODUCT_TYPES
...
Рейтинг: 0 / 0
01.02.2022, 10:34
    #40130949
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
kmskmskms
такие запросы работают медленно, проверено. У SY последний пример тоже плох, с подзапросом на каждую запись

Здесь на слово не верят.
...
Рейтинг: 0 / 0
01.02.2022, 11:41
    #40130964
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
kmskmskms
Stax, да, это будет работать но это очень плохой дизайн на каждую строку в выборке делать подзапрос where exists (SELECT ...), такие запросы работают медленно, проверено. У SY последний пример тоже плох, с подзапросом на каждую запись
План запроса построили в уме?
Там у вас такой же оптимизатор, как в Oracle Database? (похоже, что намного хуже :-) )
...
Рейтинг: 0 / 0
01.02.2022, 16:57
    #40131062
kmskmskms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
123йй,
тут это и так очевидно глядя на код. В уме представь как будет проходить запрос в целом.
В идеале сделать както джойном но чтоб учитывались не все а хотябы одно вхождение дочерней таблицы.

Таблицы огроменные, и вариант с подзапросами на каждую строку не вариант )
...
Рейтинг: 0 / 0
01.02.2022, 17:10
    #40131072
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
kmskmskms
123йй,
тут это и так очевидно глядя на код. В уме представь как будет проходить запрос в целом.
В идеале сделать както джойном но чтоб учитывались не все а хотябы одно вхождение дочерней таблицы.

Таблицы огроменные, и вариант с подзапросами на каждую строку не вариант )
вы несёте бред. Почитайте про трансформации оптимизатора хоть немного. И предоставляйте планы со статистиками вместо голословных утверждений.
...
Рейтинг: 0 / 0
01.02.2022, 17:22
    #40131079
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
kmskmskms

Таблицы огроменные


сравните результаты по факту, и огласите результаты,с учетом
авторв запросе мне надо запросить только список названий групп и их ИД

если ид и ид_ref проиндексированы время должно быть приемлемо

зы
оракля не обязан "на каждую строку в выборке делать подзапрос"

....
stax
...
Рейтинг: 0 / 0
01.02.2022, 18:10
    #40131094
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
kmskmskms
У SY последний пример тоже плох, с подзапросом на каждую запись


Оптимизатор в большинстве случаев выберет тот-же план что с EXISTS что с IN:


Код: 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.
SQL> select deptno,dname
  2  from dept d
  3  where exists (select 1 from emp e where e.deptno = d.deptno)
  4  /

    DEPTNO DNAME
---------- --------------
        10 ACCOUNTING
        20 RESEARCH
        30 SALES


Execution Plan
----------------------------------------------------------
Plan hash value: 1090737117

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     3 |    48 |     6  (17)| 00:00:01 |
|   1 |  MERGE JOIN SEMI             |         |     3 |    48 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    52 |     2   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN           | PK_DEPT |     4 |       |     1   (0)| 00:00:01 |
|*  4 |   SORT UNIQUE                |         |    14 |    42 |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL         | EMP     |    14 |    42 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------



Код: 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.
SQL> select deptno,dname
  2  from dept d
  3  where d.deptno in (select e.deptno from emp e)
  4  /

    DEPTNO DNAME
---------- --------------
        10 ACCOUNTING
        20 RESEARCH
        30 SALES


Execution Plan
----------------------------------------------------------
Plan hash value: 1090737117

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     3 |    48 |     6  (17)| 00:00:01 |
|   1 |  MERGE JOIN SEMI             |         |     3 |    48 |     6  (17)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    52 |     2   (0)| 00:00:01 |
|   3 |    INDEX FULL SCAN           | PK_DEPT |     4 |       |     1   (0)| 00:00:01 |
|*  4 |   SORT UNIQUE                |         |    14 |    42 |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL         | EMP     |    14 |    42 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------



И как видишь таблица в subquery читается один раз. И на большой таблице это может быть не оптимально. Оптимальней может быть индекс на EMP.DEPTNO (PRODUCT_TYPES.GROUP_ID) и NESTED LOOPS SEMI. Т.е. ползем по PRODUCT_GROUPS и для каждой её строки просто проверяем индекс на PRODUCT_TYPES.GROUP_ID.

SY.
...
Рейтинг: 0 / 0
01.02.2022, 18:34
    #40131098
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
найти записи которым есть соответствие
SY
И на большой таблице это может быть не оптимально.

В таких простых случаях, для большой ведомой таблицы, у оптимизатора на 100% хватит ума не сваливаться в сортировку большой таблицы, да и в джойн тоже.
Вполне сам переставит источники соединения, и сам превратит в фильтр, по крайней мере, для exists

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


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