如何在Join Query期间使用WHERE条件中的分隔数据?

时间:2010-06-28 18:25:14

标签: sql oracle

假设我有两个表EMPLOYEE和INCHARGE_ROOM,EMPLOYEE.INCHARGE_ROOMS有| INCHARGE_ROOM.ID的分隔数据

EMPLOYEE


  

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

INCHARGE_ROOM

  

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

4 个答案:

答案 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 || '|');