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
现在的样子
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