В течение последних двух лет у меня есть небольшая работа по обучению Oracle SQL, благодаря которой я получил большую часть своей работы (это не большая часть моей работы, кроме простого выбора, удаления, обновления, поворота и т. Д.).).Недавно я получил очень сложное требование, намного превышающее мои технические возможности, к сожалению, у меня нет доступа к профессиональному администратору базы данных, чтобы получить некоторую помощь по этому вопросу.Мне нужен SQL-скрипт оракула, который вернет правильные данные и формат.
Сделанный мной запрос возвращает необходимую информацию:
SELECT T1.ATTRIBUTE_1,
T1.ATTRIBUTE_2,
T1.ATTRIBUTE_3,
T1.COMMON_IDENTIFIER,
T2.ERROR,
T2.STATUS,
T2.TYPE
T2.TYPE_NUMBER
FROM TABLE_1 T1,
TABLE_2 T2
WHERE T1.COMMON_IDENTIFIER = T2.COMMON_IDENTIFIER;
Это намного проще, чемрезультаты, которые я ищу, но имеют все данные, которые мне нужны, и это дает такие результаты (результаты, которые я ищу, будут продиктованы третьей таблицей):
ATTRIBUTE_1 ATTRIBUTE_2 ATTRIBUTE_3 COMMON_IDENTIFER ERROR STATUS TYPE TYPE_NUMBER
BLAH BLAH BLAH A1 E S TYPE i #######
BLAH BLAH BLAH A1 E S TYPE ii #######
BLAH BLAH BLAH A1 E S TYPE iii #######
BLAH BLAH BLAH A5 E S TYPE i #######
BLAH BLAH BLAH A5 E S TYPE ii #######
BLAH BLAH BLAH A7 E S TYPE i #######
BLAH BLAH BLAH A1 E S TYPE iv #######
Я почесался через Интернет и нашел простой пример того, какой тип поведения я ищу:
Поворот данных дважды с динамическим sql и именами пользовательских столбцов
Я попал в стену, пытаясь перевести это с SQL-сервера на оракула, но он шел медленно, и мне в конечном итоге нужно будет объединить результаты этого запроса с результатами из другой таблицы.
Я создал запрос, который получаетЯ близок к решению, но в нем отсутствуют данные ОШИБКА и СОСТОЯНИЕ для данного ТИПА и соответствующего TYPE_NUMBER:
SELECT * FROM (
SELECT T1.COMMON_IDENTIFIER,
T2.TYPE,
T2.TYPE_NUMBER,
T2.ERROR,
T2.STATUS
FROM TABLE_1 T1, TABLE_2 T2
WHERE T1.COMMON_IDENTIFIER = T2.COMMON_IDENTIFIER
AND T2.TYPE IN ('TYPE i', 'TYPE ii', 'TYPE iii', 'TYPE iv'))
PIVOT (
MAX(TYPE_NUMBER) FOR TYPE IN ('TYPE i', 'TYPE ii', 'TYPE iii', 'TYPE iv')
)
С результатами, выглядящими так:
COMMON_IDENTIFIER STATUS ERROR TYPE i TYPE ii TYPE iii TYPE iv
A1 S E ####### ####### ####### #######
A5 S E ####### #######
A7 S E #######
Это очень близко к тому, что я ищу, но мне не хватает данных ERROR и STATUS для каждого уникального TYPE_NUMBER для данного значения TYPE (TYPE i, TYPE ii и т. Д.).Кроме того, заголовки столбцов «TYPE i», «TYPE ii» и т. Д. Должны быть динамическими, поскольку их значения могут изменяться в любой момент времени и привязаны к третьей таблице.
Мне нужен оракулSQL-запрос, который даст мне результаты, которые будут выглядеть следующим образом:
ATTRIBUTE_1 ATTRIBUTE_2 ATTRIBUTE_3 COMMON_IDENTIFIER ERROR_i STATUS_i TYPE_i ERROR_ii STATUS_ii TYPE_ii ERROR_iii STATUS_iii TYPE_iii etc.
BLAH BLAH BLAH A1 E S ####### E S ####### E S #######
BLAH BLAH BLAH A5 E S ####### E S #######
BLAH BLAH BLAH A7 E S #######
Некоторые примечания по результатам, которые я ищу:
-Значения дляСтолбец TYPE в первом запросе и используемый в качестве заголовков во втором искомом запросе, продиктован третьей таблицей, к которой у пользователя есть доступ, и он может забрать или добавить значения на лету.например, в первом запросе есть только 4 значения для столбца TYPE, это может измениться в любое время.
- Значение столбца TYPE_NUMBER специально связано со значением TYPE (TYPE i, TYPE ii и т. д.)вместе со значениями для столбца ERROR и STATUS.Поэтому, если пользователь создает новое значение TYPE в третьей таблице, мне нужно иметь возможность динамически создавать столбцы TYPE_XX, ERROR_XX и STATUS_XX для учета изменений.
Как я уже говорил выше, выше моего техническогоспособность и я прошу прощения за любую избыточность.У меня нет никакого формального обучения SQL, так как все это было на работе, я просто хотел быть максимально ясным при описании проблемы и решения, которое я ищу.
Спасибо зазаранее за любую помощь!