[英]How do I join on one column being a prefix of another?
Given two tables containing path columns that indicate the hierarchical placement in an organization, and emp1 that is a member of team1 in department1 in company acme (an emp can have multiple paths), and department managers (one manager can manage several departments):给定两个表,其中包含路径列,指示组织中的层次结构,emp1 是 company acme 中 department1 中 team1 的成员(一个 emp 可以有多个路径),以及部门经理(一个经理可以管理多个部门):
create table emp (
username varchar(10),
path varchar(255)
);
create table manages (
username varchar(10),
path varchar(255)
);
insert into emp (username, path)
values ('emp1', '/acme/dept1/team1'),
('emp1', '/acme/dept9'),
('emp2', '/acme/dept2/team1');
insert into manages (username, path)
values ('mngr1', '/acme/dept1'),
('mngr2', '/acme/dept2'),
('mngr2', '/acme/dept3');
How can I check if emp1 is a subordinate of mngr1, ie if there is a manages.path that is a prefix of emp.path?如何检查 emp1 是否是 mngr1 的下属,即是否有一个 manages.path 是 emp.path 的前缀?
Something like:就像是:
select manages.username
from emp
join manages on manages.path is-prefix-of emp.path
where emp.username = 'emp1' and manages.username = 'mngr1'
which should return mngr1.这应该返回 mngr1。
The actual path implementation is based on a fixed length primary key encoding (meaning that by construction /acme/dept1 wouldn't be a prefix of /acme/dept10).实际的路径实现基于固定长度的主键编码(这意味着通过构造 /acme/dept1 不会是 /acme/dept10 的前缀)。
Use a LIKE
expression here:在此处使用
LIKE
表达式:
SELECT m.username
FROM emp e
INNER JOIN manages m
ON e.path LIKE CONCAT(m.path, '%')
WHERE e.username = 'emp1' AND m.username = 'mngr1';
The LIKE
expression in the above query says that e.path
starts with m.path
.上述查询中的
LIKE
表达式表示e.path
以m.path
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.