简体   繁体   English

如何加入一列作为另一列的前缀?

[英]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.pathm.path

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM