знанокам PL/SQL (подкорректировать запрос)
Создана: 31 Марта 2015 Втр 11:40:44.
Раздел: "Компьютерный раздел"
Сообщений в теме: 3, просмотров: 2291
-
Добрый день!
Есть не оптимальный запрос к БД ORACLE, дающий выборку уникальных значений, содержащих "499" из заведомо известных столбцов (их, конечно, больше, чем в примере) таблицы GEN_EXT_STAYREC_REV
SELECT DISTINCT f
FROM
(SELECT D_PHONE_NO AS f FROM GEN_EXT_STAYREC_REV WHERE D_PHONE_NO LIKE '%499%'
UNION ALL
SELECT D_FAX_NO FROM GEN_EXT_STAYREC_REV WHERE D_FAX_NO LIKE '%499%'
UNION ALL
SELECT D_HOME_PHONE_NUMBER
FROM GEN_EXT_STAYREC_REV WHERE D_HOME_PHONE_NUMBER LIKE '%499%'
UNION ALL
SELECT C_COMM3_VALUE FROM GEN_EXT_STAYREC_REV WHERE C_COMM3_VALUE LIKE '%499%'
)
.
Как его скорректировать, чтобы выбирал из всех столбцов указанной таблицы?
Как выбирать значения по подстроке из всех столбцов всех таблиц?
Заранее спасибо!
Всего лучшего! -
MaxT писал(а) :
Как его скорректировать, чтобы выбирал из всех столбцов указанной таблицы?
Как выбирать значения по подстроке из всех столбцов всех таблиц?
Для Oracle 11 можно применить конструкцию с unpivot. Например так:
SELECT f
FROM
(SELECT D_PHONE_NO, D_FAX_NO, D_HOME_PHONE_NUMBER, C_COMM3_VALUE FROM GEN_EXT_STAYREC_REV)
UNPIVOT (F FOR COLS IN (D_PHONE_NO, D_FAX_NO, D_HOME_PHONE_NUMBER, C_COMM3_VALUE))
WHERE f LIKE '%499' GROUP BY f
Но непонятно что имеется ввиду "чтобы выбирал из всех столбцов указанной таблицы" ? Вообще всех, т.е. чтобы и числовые, и строковые, и столбцы типа "Дата" попали внутрь одного столбца?
Если так - то придется писать динамический SQL и формировать результирующий запрос со списком колонок, взятых, например, из представления ALL_TAB_COLUMNS
P.S.
1. В указанном вами начальном запросе указание DISTINCT излишне, т.к. UNION в результате оставляет только уникальные записи. (Имею ввиду, что вместо UNION ALL - написать просто UNION)
2. Для ORACLE 10 - UNPIVOT нельзя применить
3. Я бы предложил изменить архитектуру, и для хранения контактных данных создать доп.таблицу со столбцами: ("ID из GEN_EXT_STAYREC_REV), (Тип контакта: Домашний, мобильный, факс и т.п.), (Номер). Тогда все телефоны/контактные номера будут в одном столбце (Номер) - и подобная выборка из такой таблицы будет значительно проще. -
red_knight писал :
Но непонятно что имеется ввиду "чтобы выбирал из всех столбцов указанной таблицы" ? Вообще всех, т.е. чтобы и числовые, и строковые, и столбцы типа "Дата" попали внутрь одного столбца?
Спасибо большое, попробую. В ближайшей перспективе интерес будут представлять строковые поля. "499" я указал для примера. Структуру БД, конечно, со временем будем приводить в порядок.