Index · Правила · Поиск· Группы · Регистрация · Личные сообщения· Вход

Список разделов Компьютерный раздел
 
 
 

Раздел: Компьютерный раздел знанокам PL/SQL (подкорректировать запрос) 

Создана: 31 Марта 2015 Втр 11:40:44.
Раздел: "Компьютерный раздел"
Сообщений в теме: 3, просмотров: 2284

  1. MaxT


    Хранитель


    Более 10 лет на форуме
    31 Марта 2015 Втр 11:40:44
    Добрый день!

    Есть не оптимальный запрос к БД 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%'
    )

    .
    Как его скорректировать, чтобы выбирал из всех столбцов указанной таблицы?
    Как выбирать значения по подстроке из всех столбцов всех таблиц?

    Заранее спасибо!

    Всего лучшего!
  2. red_knight


    Начинающий


    Более 10 лет на форумеМуж.
    31 Марта 2015 Втр 14:44:08
    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), (Тип контакта: Домашний, мобильный, факс и т.п.), (Номер). Тогда все телефоны/контактные номера будут в одном столбце (Номер) - и подобная выборка из такой таблицы будет значительно проще.
  3. MaxT


    Хранитель


    Более 10 лет на форуме
    31 Марта 2015 Втр 17:55:13
    red_knight писал :
    Но непонятно что имеется ввиду "чтобы выбирал из всех столбцов указанной таблицы" ? Вообще всех, т.е. чтобы и числовые, и строковые, и столбцы типа "Дата" попали внутрь одного столбца?

    Спасибо большое, попробую. В ближайшей перспективе интерес будут представлять строковые поля. "499" я указал для примера. Структуру БД, конечно, со временем будем приводить в порядок.