2016-03-30 4 views
0

Я пишу хранимую процедуру, которая должна возвращать документ id . Этот идентификатор документа может быть любым из двух полей. APP_DOC_ID (добавлено из приложения) BTCH_DOC_D (добавлено из пакета) оба являются разными полями в одной таблице.Как использовать RECORD или CURSOR в том месте, где проводимость

Мне нужно получить эти docid на основе подзапроса.

SELECT DISTINCT APP_DOC_ID FROM 
(SELECT APP_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN 
(SUBQUERY)) 
UNION ALL 
SELECT DISTINCT BTCH_DOC_ID FROM 
(SELECT BTCH_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN 
(SUBQUERY)) 

Мой подзапрос немного сложнее, так что я не хочу, чтобы запустить этот запрос 2 раз-APP_DOC_ID и BTCH_DOC_ID, Можно ли сохранить подзапросы результатов в RECORD или CURSOR и использовать его как запрос-х

Например

BEGIN 
OPEN P_CURSOR FOR (Select AB.XX||AB.XY||AB.XZ from ....) 
SELECT DISTINCT APP_DOC_ID FROM 
    (SELECT APP_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN P_CURSOR) 
UNION ALL 
SELECT DISTINCT BTCH_DOC_ID FROM 
(SELECT BTCH_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN P_CURSOR) 

это такой подход Я не выполняю свой сложный подзапрос 2 раза.

Спасибо за вашу помощь и время

+0

Вы отметили это для MySQL и SQL Server, которые являются двумя совершенно разными механизмами баз данных. Затем вы отметили его PL/SQL, который является языком, который существует только в базе данных Oracle, которая является третьим совершенно другим механизмом базы данных. Какую базу данных вы действительно используете? Мое предположение из вашего синтаксиса заключается в том, что вы используете Oracle, а теги MySQL и SQL Server должны быть удалены, но это просто предположение. –

ответ

1

Вы можете использовать WITH пункт:

WITH subquery AS(
    SELECT .... your complex subquery goes here 
) 
SELECT DISTINCT APP_DOC_ID FROM 
(SELECT APP_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN 
(SELECT * FROM SUBQUERY)) 
UNION ALL 
SELECT DISTINCT BTCH_DOC_ID FROM 
(SELECT BTCH_DOC_ID FROM XXXXXX BC WHERE BC.XX||BC.XY||BC.XZ IN 
(SELECT * FROM SUBQUERY SUBQUERY)) 

Смотрите эту ссылку для подробностей: subquery factoring clause

В С QUERY_NAME п позволяет присвоить имя к блоку подзапроса. Затем вы можете ссылаться на блок подзапроса на несколько мест в запросе , указав имя запроса. Oracle Database оптимизирует запрос , обрабатывая имя запроса как встроенное представление, так и временную таблицу .

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