假设我有两个表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_ID INCHARGE_ROOM_NAME
1个RED
2 BLUE
3黄色
4 ORANGE
5 BLACK
如果我想
选择所有可以吸入的房间。
预期结果是
NAME INCHARGE_ROOM
K RED
K BLUE
K黄色 K ORANGE
答案 0 :(得分:6)
我试过这样做一次;它效果不好。
SQL旨在将表链接在一起,因此它应该有另一个表incharge_rooms(employee_id,room_id)
,而不是incharge_rooms列。 (主键在两列上)
然后你就加入他们,得到你想要的任何东西。
答案 1 :(得分:1)
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
答案 2 :(得分:0)
这是如何不构建数据的典型示例。 Bill Karwin的书“SQL AntiPatterns”称之为 JayWalking 。
您的桌面设计应该是固定的。如果你无法修复它,那么你必须使用特定于DBMS的技术来撤消破坏的模式设计所造成的损害。
您需要3个表,而不是2个表:
Employee (EmployeeID, Name)
InChargeRoom (InChargeRoomID, InChargeRoomName)
EmpInCharge (EmployeeID, InChargeRoomID)
然后,您可以进行简单的3向连接,以便轻松获得所需的结果。
答案 3 :(得分:0)
假设您无法更改结构(许多人因遗留代码或第三方代码而无法更改):
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 || '|');