Oracle Sql - Скрипт работает очень медленно при включении подзапроса в оператор IN - PullRequest
0 голосов
/ 18 июня 2020

Таблица: Число

A     B
----- --
12    34
22    34
11    35
13    36

Таблица: Данные

B     C     D
----- ----- --
34    A     B
34    C     D
35    E     F
35    G     H
36    I     J
36    K     L

Я хочу вернуть значение в B, когда A является дублирующим сопоставлением с B. В этом примере выбрано 34 (на практике он вернет более 100+ повторяющихся значений).

После получения 34 я хочу вернуть все строки в таблице «Данные», где B = 34

B     C     D
----- ----- -----
34    A     B
34    C     D

Моя попытка:

With Number as (
    select  B,count(B) as count
    from  Number
    where 1=1
    group by B
)
, Number2 As (
    select B
    from Number 
    where count>1
, Data As (
    select * from Data where B in (select * from Number2)
)

Но когда я бегу сценарий работает очень медленно. Мне интересно, есть ли лучший способ сделать это быстрее

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Как насчет JOIN? Строки 1-15 представляют собой образцы данных (вы не вводите их); запрос, который вам действительно нужен, начинается со строки №16.

SQL> with
  2  tnumber (a, b) as
  3    (select 12, 34 from dual union all
  4     select 22, 34 from dual union all
  5     select 11, 35 from dual union all
  6     select 13, 36 from dual
  7    ),
  8  tdata (b, c, d) as
  9    (select 34, 'a', 'b' from dual union all
 10     select 34, 'c', 'd' from dual union all
 11     select 35, 'e', 'f' from dual union all
 12     select 35, 'g', 'h' from dual union all
 13     select 36, 'i', 'j' from dual union all
 14     select 36, 'k', 'l' from dual
 15    )
 16  select d.*
 17  from tdata d join (select n.b
 18                     from tnumber n
 19                     group by n.b
 20                     having count(*) > 1
 21                    ) x
 22                 on d.b = x.b;

         B C D
---------- - -
        34 a b
        34 c d

SQL>
0 голосов
/ 18 июня 2020

Попробуйте:

SELECT D.* FROM(SELECT B FROM Number GROUP BY B HAVING COUNT(B) > 1)TEMP
JOIN DATA D ON D.B = TEMP.B
0 голосов
/ 18 июня 2020

Вы можете использовать предложения GROUP BY и HAVING следующим образом:

SELECT *
  FROM DATA_TABLE D
 WHERE D.B IN (
    SELECT B
      FROM NUMBER_TABLE
     GROUP BY B
    HAVING COUNT(1) > 1)

Индекс по столбцу B в обеих таблицах поможет вам снизить стоимость запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...