Избежание одних и тех же таблиц - PullRequest
0 голосов
/ 15 мая 2018

У меня есть таблица с именем основной комбинации, возрастом, адресом, на основе комбинации мы должны найти идентификатор из таблицы DUMMY_TEST.

И для этого идентификатора в таблице DUMMY_TEST необходимополучить всю комбинацию имени, возраста и адреса, которая должна быть сопоставлена ​​с таблицей DUMMY_ID_VALUE, чтобы получить результат в столбце Valuee.

Требуется приведенный ниже ожидаемый результат, не присоединяясь к одной и той же таблице DUMMY_TEST дважды, поскольку в ней миллионызаписи в реальном времени создаст проблему производительности.

Может кто-нибудь поможет создать запрос с хорошей производительностью без использования одной и той же таблицы дважды.

--table creation
CREATE TABLE DUMMY(NAME VARCHAR2(100),AGE VARCHAR2(100),ADDRESS VARCHAR2(100), ID VARCHAR2(100));
--data loading
INSERT INTO DUMMY VALUES('SAM','30','ITALY','100');
INSERT INTO DUMMY VALUES('RAGHU','20','VENICE','300');
INSERT INTO DUMMY VALUES('TOM','40','JAPAN','200');

CREATE TABLE DUMMY_TEST(NAME VARCHAR2(100),AGE VARCHAR2(100),ADDRESS VARCHAR2(100), ID VARCHAR2(100));
INSERT INTO DUMMY_TEST VALUES('SAM','30','ITALY','100');
INSERT INTO DUMMY_TEST VALUES('TOM','40','JAPAN','200');
INSERT INTO DUMMY_TEST VALUES('BROSNAN','20','INDIA','100');
INSERT INTO DUMMY_TEST VALUES('ARJUN','30','AMERICA','200');
INSERT INTO DUMMY_TEST VALUES('SAMUEL','40','BERLIN','100');
INSERT INTO DUMMY_TEST VALUES('RAM','60','GERMANY','200');

--table creation
CREATE TABLE DUMMY_ID_VALUE(ID VARCHAR2(100),VALUEE VARCHAR2(100));
--data loading
INSERT INTO DUMMY_ID_VALUE VALUES(100,'INCLUDED');
INSERT INTO DUMMY_ID_VALUE VALUES(200,'exclueded');
INSERT INTO DUMMY_ID_VALUE VALUES(300,'PARTIAL');

Запрос

SELECT DT.NAME,DT.AGE,DT.ADDRESS,DT.ID,DUMMY_ID_VALUE.VALUEE 
FROM DUMMY 
  LEFT OUTER JOIN DUMMY_TEST A
  ON DUMMY.NAME = A.NAME AND DUMMY.AGE = A.AGE AND DUMMY.ADDRESS = A.ADDRESS 
  LEFT OUTER JOIN DUMMY_TEST DT
  ON DT.ID = A.ID
  INNER JOIN DUMMY_ID_VALUE
  ON DUMMY_ID_VALUE.ID = DT.ID;

Фактический результат

NAME   AGE ADDRESS ID  VALUEE
---------------------------------
SAM        30  ITALY   100 INCLUDED
BROSNAN    20  INDIA   100 INCLUDED
SAMUEL 40  BERLIN  100 INCLUDED

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

NAME   AGE ADDRESS ID  VALUEE
---------------------------------
SAM        30  ITALY   100 INCLUDED
BROSNAN    20  INDIA   100 INCLUDED
SAMUEL 40  BERLIN  100 INCLUDED
RAGHU  20  VENICE  300 PARTIAL

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Ваш запрос в порядке, кроме join с. Я бы пошел на:

SELECT DT.NAME, DT.AGE, DT.ADDRESS, DT.ID, DUMMY_ID_VALUE.VALUEE 
FROM DUMMY LEFT OUTER JOIN
     DUMMY_TEST A
     ON DUMMY.NAME = A.NAME AND DUMMY.AGE = A.AGE AND DUMMY.ADDRESS = A.ADDRESS LEFT OUTER JOIN
     DUMMY_TEST DT
     ON DT.ID = A.ID LEFT JOIN
     DUMMY_ID_VALUE
     ON DUMMY_ID_VALUE.ID = DT.ID;

Финальное соединение должно быть LEFT JOIN. Для производительности ваш запрос в порядке. Индекс на DUMMY_TEST(NAME, AGE, ADDRESS) поможет вашей производительности.

0 голосов
/ 15 мая 2018

Итак, у вас есть две проблемы: одну (избегайте двойного соединения) легко решить:

select A.NAME, A.AGE, A.ADDRESS, A.ID, DUMMY_ID_VALUE.VALUEE 
FROM DUMMY
    left OUTER JOIN DUMMY_TEST A ON (DUMMY.NAME = A.NAME AND DUMMY.AGE = A.AGE AND DUMMY.ADDRESS = A.ADDRESS) or (DUMMY.ID = A.ID)
    INNER JOIN DUMMY_ID_VALUE on DUMMY_ID_VALUE.ID = A.ID

, но я не уверен, улучшит ли она производительность.
Другая проблема заключается в том, чторезультаты, которые вы получаете, не соответствуют вашим ожиданиям, при условии, что логика, которую вы указали в запросе, должна содержать 6 строк.

...