Home > Software engineering >  ORACLE SQL select name from the same table using ID provided in another field
ORACLE SQL select name from the same table using ID provided in another field

Time:04-25

How it looks now

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

How it should look

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

I tried using joins, but this is not how it's supposed to work. My query was:

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

But as I already got "where partner_id = id" is not how I thought it will work with the situation where I need to get id by the another column from the same table.

CodePudding user response:

You can use a hierarchical query (then you do not need a JOIN or a correlated 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;

If you want to fix your query then you need to give the tables in the inner and outer query aliases and then refer to the columns you are using to correlate between the inner and outer query using those aliases (otherwise the inner query will assume that all the columns are from the local scope of the inner query):

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

Or, with a 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

Which, for the sample data:

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;

All output:

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

db<>fiddle here

CodePudding user response:


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

  • Related