Apex 提供允许多项选择的选择列表(以及穿梭)项目。如果将这些值存储到数据库列中,它们将存储为冒号分隔的值。例如,如果您选择 Roma、Juventus 和 Inter,它们将被存储为 Roma:Juventus:Inter(实际上,它们的 return 值是一些 ID,例如23:8846:2231)。没问题,你有你想要的。
但是,这样的原则是 晚安,标准化,因为您对此无能为力。如果您想显示隐藏在这样一个存储 ID 列表后面的值,则必须将该字符串拆分为行并将其与 master 表连接。当然,这并非不可能,但需要一些编码。例如:
SQL> select * From sca_team;
TEA_ID TEA_NAME
---------- --------------------
1 Roma
2 Juventus
3 Inter
SQL> select * from sca_users;
USR_ID TEAMS
---------- --------------------
103 2:3:1
SQL> select t.tea_name
2 from sca_team t join
3 (select regexp_substr(u.teams, '[^:]+', 1, level) team_id
4 from sca_users u
5 where u.usr_id = 103
6 connect by level <= regexp_count(u.teams, ':') + 1
7 ) x on x.team_id = t.tea_id
8 order by t.tea_name;
TEA_NAME
--------------------
Inter
Juventus
Roma
SQL>
更糟糕的是 - 如果有人手动编辑这样的列值,他们可以输入 master 表中不存在的无效 ID。换句话说,不维护参照完整性。
因此,虽然你可以这样做,但我不建议这样做。
处理这种情况的通常方法是创建一个包含值对的新表,例如
create table user_x_team
(usr_id number constraint fk_uxt_user references sca_users (usr_id),
tea_id number constraint fk_uxt_team references sca_team (tea_id),
--
constraint pk_uxt primary key (usr_id, tea_id)
);
- 外键约束将确保您不能为用户或团队输入无效值
- 主键约束确保您不能有重复项
在 Apex 中,您可以选择 交互式网格 来处理这种情况,因为它允许您输入任意数量的行(只需按“添加行”按钮)。