2017-02-17 26 views
0

Мне нужно создать функцию, которая возвращает курсор sysref, указывающий на некоторый набор результатов. мне нужно, чтобы присоединиться к глобальной временной таблицы с несколькими другими таблицами, основной Подход будет выглядеть следующим образом:Сплит-соединение нескольких таблиц в PL-SQL

Open sysrefcur for 
    select * 
    from 
     (select * 
     from globaltemptable) t1 
     left join t2 
     on <conditions1> 
     left join t3 
     on <conditions2> 
     left join t4 
     on <conditions2> 
     ... 
     ; 
     return sysrefcur; 

Проблема заключается в том, что я должен совместной глобальной временной таблицы (ГТТ) с около 30 дополнительных таблиц (Я знаю, это много), но администраторы баз данных установили предел в 10 объединений,

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

Я хочу знать, есть ли лучший подход к этому, и если я могу вообще не создавать дополнительные временные таблицы.

Благодарим за помощь.

+0

Что это означает, что ограничение 10 соединений? Почему у вас такой предел? – Kacper

+3

Лучшим подходом было бы создание бизнес-кейса, почему запрос, который объединяет 30 таблиц, необходим для «выполнения вашей работы». Затем лица, ответственные за принятие бизнес-решений, переопределяют ограничение DBA, если оно мешает «выполнять работу». Конечно, возможно, что вы и команда узнаете, что все, что вам нужно сделать, не требует объединения 30 таблиц; возможно, ваше решение не является оптимальным. – mathguy

+3

Или вы найдете другой подход, который намного менее оптимален, возьмите больше ресурсов, чем сумма, которую DBA (предположительно) пыталась сохранить. «10 присоединяется» так же, как и ничего. БД должна научиться использовать диспетчер ресурсов и управление ресурсами как дисциплину. BobC

ответ

2
  1. Создайте представления, которые выполняют 5 объединений, а затем присоединяются к 6 видам.

  2. Использование CTE. Определите with операторы с некоторыми объединениями, затем присоедините результаты к with операторам.

+0

Я бы проголосовал за CTE (так называемый факторинг подзапроса, ака «предложение с»), чтобы сделать это.Конечно, если ваши администраторы баз данных установили лимит в 10 объединений, это вряд ли фактически ограничит запрос 10 соединениями, поскольку, вероятно, произойдет переписывание запросов. – Boneist

+0

Спасибо @kacper, я не знал, что вы можете сразу ссылаться на таблицы, которые вы только что создали, используя 'WITH', т. Е. Можно сделать' с tbl1 as (выберите 1 как col1 из tst), tbl2 as (выберите * from (выберите * из tbl1)) выберите * из tbl1 cross join tbl2', тогда как невозможно выбрать 'select * from (выберите 1 как col1 из tst) tbl1 cross join (выберите * from (выберите * из tbl1)) tbl2'. Я использовал ваш предложенный подход. – user1792210

1

Я думаю, что подход, предложенный вами в вашем сообщении, вероятно, лучше всего. Это просто реализовать и понять, а не ужасно менее эффективно, чем делать это правильно (я второй/третий критику политики вашего DBA), и это явно соответствует политике. (Использование представлений или CTE, возможно, является «нарушениями», так как в конце всего это еще 30-страничный запрос).

и если я вообще не могу создать дополнительные временные таблицы.

Вы можете избежать создания дополнительной глобальной таблицы temp, если вы можете добавить столбцы-заполнители к тому, который у вас есть. В таком случае ваше решение будет выглядеть примерно так:

ALTER TABLE globaltemptable ADD ... placeholder columns for T2, T3, T4, etc data... 


MERGE INTO globaltemptable t 
USING (SELECT * FROM globaltemptable t1 
     LEFT JOIN ... t2 through t10 (10 table join) ... 
    ) u 
ON (t.primary_key = u.primary_key) 
WHEN MATCHED THEN UPDATE SET ... t2 through t10 columns in globaltemptable ... 
; 

... repeat merge for tables t11 through t19 

... repeat merge for tables t20 through t28 

... repeat merge for tables t29 through t30 


OPEN SYSREFCUR FOR SELECT * FROM globaltemptable -- no joins. 
+0

Спасибо за ваш ответ Мэтью. Да, используя CTE, вы также получите 30-ти табличный запрос, политика dbas состоит в том, что вы не делаете больше, чем 10 объединений в одном запросе, поэтому для них выполняется три подзапроса с 10 присоединениями каждый, а затем их объединение является действительная политика, поэтому я принял подход @kacper, но я благодарен, что вы делитесь своей альтернативой с нами, для меня она состоит из более продвинутой концепции, которую я смогу обучать и учиться. – user1792210

 Смежные вопросы

  • Нет связанных вопросов^_^