ORACLE SQL select 来自同一 table 的名称使用另一个字段中提供的 ID

ORACLE SQL select name from the same table using ID provided in another field

现在的样子

id name partner_id
1 name1 2
2 name2 3
3 name3 1

外观应该如何

id name partner_id
1 name1 name2
2 name2 name3
3 name3 name1

我试过使用连接,但这不是它应该的工作方式。 我的查询是:

select id, 
       name, 
       (select name from table where partner_id = id) 
from   table

但是因为我已经得到“where partner_id = id”,所以我认为它不会在我需要从同一 table.[=17 的另一列获取 id 的情况下工作=]


create table dept(
  deptno number(2,0),
  dname  varchar2(14),
  loc    varchar2(13),
  constraint pk_dept primary key (deptno)
);

create table emp(
  empno    number(4,0),
  ename    varchar2(10),
  job      varchar2(9),
  mgr      number(4,0),
  hiredate date,
  sal      number(7,2),
  comm     number(7,2),
  deptno   number(2,0),
  constraint pk_emp primary key (empno),
  constraint fk_deptno foreign key (deptno) references dept (deptno)
);

insert into dept
values(10, 'ACCOUNTING', 'NEW YORK');
insert into dept
values(20, 'RESEARCH', 'DALLAS');
insert into dept
values(30, 'SALES', 'CHICAGO');
insert into dept
values(40, 'OPERATIONS', 'BOSTON');
 
insert into emp
values(
 7839, 'KING', 'PRESIDENT', null,
 to_date('17-11-1981','dd-mm-yyyy'),
 5000, null, 10
);
insert into emp
values(
 7698, 'BLAKE', 'MANAGER', 7839,
 to_date('1-5-1981','dd-mm-yyyy'),
 2850, null, 30
);
insert into emp
values(
 7782, 'CLARK', 'MANAGER', 7839,
 to_date('9-6-1981','dd-mm-yyyy'),
 2450, null, 10
);
insert into emp
values(
 7566, 'JONES', 'MANAGER', 7839,
 to_date('2-4-1981','dd-mm-yyyy'),
 2975, null, 20
);
insert into emp
values(
 7788, 'SCOTT', 'ANALYST', 7566,
 to_date('13-JUL-87','dd-mm-rr') - 85,
 3000, null, 20
);
insert into emp
values(
 7902, 'FORD', 'ANALYST', 7566,
 to_date('3-12-1981','dd-mm-yyyy'),
 3000, null, 20
);
insert into emp
values(
 7369, 'SMITH', 'CLERK', 7902,
 to_date('17-12-1980','dd-mm-yyyy'),
 800, null, 20
);
insert into emp
values(
 7499, 'ALLEN', 'SALESMAN', 7698,
 to_date('20-2-1981','dd-mm-yyyy'),
 1600, 300, 30
);
insert into emp
values(
 7521, 'WARD', 'SALESMAN', 7698,
 to_date('22-2-1981','dd-mm-yyyy'),
 1250, 500, 30
);
insert into emp
values(
 7654, 'MARTIN', 'SALESMAN', 7698,
 to_date('28-9-1981','dd-mm-yyyy'),
 1250, 1400, 30
);
insert into emp
values(
 7844, 'TURNER', 'SALESMAN', 7698,
 to_date('8-9-1981','dd-mm-yyyy'),
 1500, 0, 30
);
insert into emp
values(
 7876, 'ADAMS', 'CLERK', 7788,
 to_date('13-JUL-87', 'dd-mm-rr') - 51,
 1100, null, 20
);
insert into emp
values(
 7900, 'JAMES', 'CLERK', 7698,
 to_date('3-12-1981','dd-mm-yyyy'),
 950, null, 30
);
insert into emp
values(
 7934, 'MILLER', 'CLERK', 7782,
 to_date('23-1-1982','dd-mm-yyyy'),
 1300, null, 10
);


SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM
    emp e, emp m
WHERE e.mgr = m.empno

ENAME    EMPNO    MANAGER    MGR
BLAKE    7698    KING    7839
CLARK    7782    KING    7839
JONES    7566    KING    7839
ALLEN    7499    BLAKE    7698
WARD    7521    BLAKE    7698
MARTIN    7654    BLAKE    7698
TURNER    7844    BLAKE    7698
JAMES    7900    BLAKE    7698
MILLER    7934    CLARK    7782
SCOTT    7788    JONES    7566
FORD    7902    JONES    7566
ADAMS    7876    SCOTT    7788
SMITH    7369    FORD    7902

您可以使用分层查询(那么您不需要 JOIN 或相关的 sub-query):

SELECT id,
       name,
       PRIOR name AS partner_id
FROM   table_name
WHERE  LEVEL = 2
OR     (LEVEL = 1 AND CONNECT_BY_ISLEAF = 1)
CONNECT BY
       PRIOR id = partner_id
AND    LEVEL <= 2;

如果你想修复你的查询,那么你需要给内部和外部查询别名中的表,然后引用你正在使用的列来使用这些别名关联内部和外部查询(否则内部查询将假定所有列都来自内部查询的本地范围):

select id, 
       name, 
       (select name from table_name p where t.partner_id = p.id) AS partner_id
from   table_name t

或者,JOIN

select t.id, 
       t.name, 
       p.name AS partner_id
from   table_name t
       LEFT OUTER JOIN table_name p
       ON t.partner_id = p.id

其中,对于示例数据:

CREATE TABLE table_name (id, name, partner_id) AS
SELECT 1, 'name1', 2 FROM DUAL UNION ALL
SELECT 2, 'name2', 3 FROM DUAL UNION ALL
SELECT 3, 'name3', 1 FROM DUAL;

全部输出:

ID NAME PARTNER_ID
2 name2 name3
3 name3 name1
1 name1 name2

db<>fiddle here