Как использовать данные с разделителями в состоянии ГДЕ при присоединении к запросу? - PullRequest
0 голосов
/ 28 июня 2010

Допустим, у меня две таблицы EMPLOYEE и INCHARGE_ROOM, EMPLOYEE.INCHARGE_ROOMS имеет | данные с разделителями INCHARGE_ROOM.ID

СОТРУДНИК


ID NAME INCHARGE_ROOMS
1 K 1 | 2 | 3 | 4
2 S 2 | 4 | 5

INCHARGE_ROOM

INCHARGE_ROOM_ID INCHARGE_ROOM_NAME
1 КРАСНЫЙ
2 СИНИЙ
3 ЖЕЛТЫЙ
4 ОРАНЖЕВЫЙ
5 ЧЕРНЫЙ

Если я хочу

ВЫБЕРИТЕ ВСЕ НОМЕРА, КОТОРЫЕ КУПИЛИ.

Ожидаемый результат

NAME INCHARGE_ROOM
КРАСНЫЙ
К СИНИЙ
К ЖЕЛТЫЙ
K ОРАНЖЕВЫЙ

Ответы [ 4 ]

6 голосов
/ 28 июня 2010

Я пытался сделать это один раз;это не сработало.

SQL спроектирован так, чтобы таблицы соединялись вместе, поэтому вместо столбца incharge_rooms должна быть другая таблица incharge_rooms(employee_id,room_id).(первичный ключ находится в обоих столбцах)

Затем вы просто соединяете их вместе, чтобы получить все, что вы хотите.

1 голос
/ 28 июня 2010
select e.NAME, ir.INCHARGE_ROOM_NAME as INCHARGE_ROOM
from INCHARGE_ROOM ir
inner join EMPLOYEE e on ir.INCHARGE_ROOM_ID  like INCHARGE_ROOMS + '|%'
    or ir.INCHARGE_ROOM_ID  like '%|' + INCHARGE_ROOMS + '|%'
    or ir.INCHARGE_ROOM_ID  like '%|' + INCHARGE_ROOMS
0 голосов
/ 29 июня 2010

Предполагая, что вы не можете изменить структуру (что многие не могут из-за устаревшего кода или стороннего кода):

select 
  emp.name as NAME
  , room.incharge_room_name as INCHARGE_ROOM
from employee emp
inner join incharge_room room 
  on ('%|' || room.incharge_room_id || '|%' like '|' || emp.incharge_rooms || '|');
0 голосов
/ 28 июня 2010

Это классический пример того, как не структурировать данные.Книга Билла Карвина « SQL AntiPatterns » называет это JayWalking .

Ваш дизайн стола должен быть исправлен.Если вы не можете это исправить, то вы должны использовать специфические для СУБД методы, чтобы отменить ущерб, нанесенный нарушенной схемой.

Вам нужно 3 таблицы, а не 2:

Employee (EmployeeID, Name)
InChargeRoom (InChargeRoomID, InChargeRoomName)
EmpInCharge (EmployeeID, InChargeRoomID)

Затем вы можете сделать простое трехстороннее соединение, чтобы получить требуемый результат тривиально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...