【问题标题】:How to use Delimited data in WHERE condition during Join Query?在 Join Query 期间如何在 WHERE 条件下使用 Delimited 数据?
【发布时间】:2010-06-28 18:25:13
【问题描述】:

假设我有两个表 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                                    黑色

如果我愿意

选择 K 负责的所有房间。

预期结果是

名称                         INCHARGE_ROOM
K                                      红色
K                                      蓝色
K                                     黄色
K                                      橙色

【问题讨论】:

标签: sql oracle


【解决方案1】:

我曾经尝试过这样做;效果不好。

SQL 旨在将表链接在一起,因此它应该有另一个表 incharge_rooms(employee_id,room_id) 而不是 incharge_rooms 列。 (主键在两列上)

然后你只要把他们联合起来,得到你想要的任何东西。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      这是一个如何不结构化数据的经典示例。 Bill Karwin 的书 'SQLAntiPatterns' 称之为 JayWalking

      您的桌子设计应该是固定的。如果您无法修复它,那么您必须使用特定于 DBMS 的技术来消除损坏的架构设计所造成的损害。

      您需要 3 张桌子,而不是 2 张:

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

      然后您可以进行简单的 3-way join 以轻松获得所需的结果。

      【讨论】:

        【解决方案4】:

        假设您无法更改结构(由于遗留代码或第三方代码,许多人无法更改):

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

        【讨论】:

          猜你喜欢
          • 2011-09-02
          • 1970-01-01
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 2020-01-05
          相关资源
          最近更新 更多