2015-11-18 5 views
0

Я в настоящее время ищу лучший способ реализовать функцию для моего программного обеспечения. Я использую Oracle Stored Procedures, чтобы получить список материалов, и одним предложением будет поиск, если поле моего материала содержит одну из строк другой таблицы.Oracle - Получить элементы, содержащиеся в другой таблице

Например:

У меня есть таблица с материалами, определенных следующим образом:

ID, Имя, компоненты

И таблица компонентов определяется следующим образом:

ID, Компонент

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

Не знаю, если я очень ясно, но, как я довольно новыми для языков баз данных и Oracle, я делаю все возможное :)

Большое спасибо!

EDIT

Некоторые образцы:

Таблица компонентов:

ID| COMPONENT 
_____________ 
1 | 'TOTO 42' 
2 | 'TEST' 
3 | 'TEST42' 
4 | 'COMP1' 
5 | 'CONTROL 25' 

Таблица Материал:

ID| NAME | COMPONENTS 
__________________________ 
1 | 'MAT1' | 'TOTO 42;TEST' 
2 | 'MAT2' | 'CPTX' 
3 | 'MAT3' | 'AZER;TYUO' 
4 | 'MAT4' | 'PL;MLX;23' 
5 | 'MAT5' | 'CONTROL 25;COMP1;MLX' 

Я хотел бы запрос на стол Материал, который возвращает только MAT1 и MAT5 (потому что один из их компонентов находится в таблице Component).

Спасибо!

+1

Это поможет, если вы предоставили пример данных для этих двух таблиц и желаемого результата. –

ответ

3

Сначала дизайн не очень хороший. Вы хотели бы хранить componets в чем-то вроде этого

ID, component 
    1,  A 
    1,  B 
    1,  C 

Так что ваши querys может использовать индекс

Давайте предположим, что вам компоненты что-то вроде A;B;C

Sql Fiddle Demo

SELECT DISTINCT m.ID, m.NAME 
FROM MATERIALS m 
JOIN COMPONENT c 
    ON ';' || UPPER(m.COMPONENTS) || ';' LIKE '%;' || UPPER(c.Component) || ';%' 

ВЫВОД

| ID | NAME | 
|----|------| 
| 5 | MAT5 | 
| 1 | MAT1 | 
+0

Я использую базу данных клиента, и я не могу ее изменить, у меня только есть доступ на чтение – EdRbt

+0

Я делаю обновление после обеда, проверит его. –

+0

Включите пробную скрипку –