В упрощенной форме, у нас есть две таблицы - транзакционной таблицы TR и таблицу ITEM:Подключить таблицы без подзапроса?
Таблица ITEM:
+---------+-----------+
| ITEM_ID | ITEM_DESC |
+---------+-----------+
| AAA | parent |
| AAA111 | child abc |
| AAA222 | child xyz |
+---------+-----------+
Таблица ТР:
+-------+------------+
| TR_ID | TR_ITEM_ID |
+-------+------------+
| 1 | AAA |
| 2 | AAA111 |
| 3 | AAA222 |
| 4 | AAA333 |
| 5 | AAA444 |
+-------+------------+
Когда мы объединяем эти две таблицы , если TR_ITEM_ID
не существует в таблице поиска (например, для AAA333
или AAA444
), такая строка должна быть присоединена к «родительскому» элементу (то есть AAA
). Родитель можно просто вывести из первых трех букв идентификатора. Таким образом, желаемый результат должен быть таким:
+-------+------------+---------+-----------+
| TR_ID | TR_ITEM_ID | ITEM_ID | ITEM_DESC |
+-------+------------+---------+-----------+
| 1 | AAA | AAA | parent |
| 2 | AAA111 | AAA111 | child abc |
| 3 | AAA222 | AAA222 | child xyz |
| 4 | AAA333 | AAA | parent |
| 5 | AAA444 | AAA | parent |
+-------+------------+---------+-----------+
В настоящее время у нас есть представление, которое делает это, но использует подзапросы. например:
select * from (
select TR.*,
(select ITEM.ITEM_ID from ITEM where TR.TR_ITEM_ID = ITEM.ITEM_ID) CHILD_LOOKUP_TYPE,
(select ITEM.ITEM_ID from ITEM where substr(TR.TR_ITEM_ID,1,3) = ITEM.ITEM_ID) PARENT_LOOKUP_TYPE
from TR
) f left outer join ITEM on ITEM.ITEM_ID =
case
when f.CHILD_LOOKUP_TYPE is not null then f.CHILD_LOOKUP_TYPE
when f.PARENT_LOOKUP_TYPE is not null then f.PARENT_LOOKUP_TYPE
end
order by TR_ITEM_ID;
Вопрос заключается в том, что если у нас не было подзапросов, вид будет выполнять величину быстрее (есть и другие объединения в реальном зрения, но в целом наша оценка является то, что он будет работать близко к 10 раз быстрее). Итак, вопрос в том, есть ли способ переписать вышеизложенный вид без подзапросов? Или любое другое предложение сделать соединение более эффективным?
Вот некоторые ограничения, которые мы имеем, в случае, если они будут делать хорошие предложения:
- Мы не можем хранить «разрешить»
ITEM_ID
в транзакционной таблице, потому что мы не можем изменить исторические данные в БД клиентов. - Даже если бы мы могли, таблица поиска время от времени будет меняться (например, они могут добавить элемент
AAA333
), поэтому «разрешенные» значения станут недействительными. - Мы не можем создать материализованное представление.
Вот некоторые быстрый SQL:
CREATE TABLE ITEM (
ITEM_ID VARCHAR2(20 BYTE),
ITEM_DESC VARCHAR2(20 BYTE)
);
Insert into ITEM (ITEM_ID,ITEM_DESC) values ('AAA','parent');
Insert into ITEM (ITEM_ID,ITEM_DESC) values ('AAA111','child abc');
Insert into ITEM (ITEM_ID,ITEM_DESC) values ('AAA222','child xyz');
CREATE TABLE TR (
TR_ID NUMBER,
TR_ITEM_ID VARCHAR2(20 BYTE)
);
Insert into TR (TR_ID,TR_ITEM_ID) values (1,'AAA');
Insert into TR (TR_ID,TR_ITEM_ID) values (2,'AAA111');
Insert into TR (TR_ID,TR_ITEM_ID) values (3,'AAA222');
Insert into TR (TR_ID,TR_ITEM_ID) values (4,'AAA333');
Insert into TR (TR_ID,TR_ITEM_ID) values (5,'AAA444');
Если item_desc отсутствует, можно ли предположить, что он всегда должен быть родителем? –
@vkp item_desc является частью таблицы поиска, которые всегда присутствуют. tr_item_id из таблицы транзакций может отсутствовать, но в этом случае мы заполняем desc «Unknown». но такие случаи могут быть решены с помощью nlv-функции. – ikcodez