使用自连接在 SQL 中查找具有相同指定属性的两名员工
Find two employees having the same designation attribute - in SQL using self joins
使用内部联接
显示与 "Peter" 具有相同名称的记录
条件:没有在 WHERE 子句中直接使用 Peter 的名称。
假设你有像 table1 table1_name,attribute1,attribute2 和 table 像 table2_name, attribute1,..., name 属性会就像一个id(通过table)
然后
SELECT * FROM table1 inner join table2 on table1_name = table2_name
尝试以下操作:
SELECT t2.Name, t2.Designation
FROM table1 t1
INNER JOIN table1 t2
ON t1.Designation = t2.Designation
WHERE t1.Name = 'Peter'
FETCH NEXT 2 ROWS ONLY
它在列 Designation
上加入 2 tables(相同的 table),过滤 peter 指定的结果并仅获取前 2 行。
内部联接 selects 匹配来自 tables 的行。要了解此处的问题,请尝试以下 SQL.
SELECT a.empname as a_empname, b.empname b_empname
FROM employee a
JOIN employee b ON(a.designation = b.designation);
我的 table 中有 Adam、Peter 和 Smith 三名员工,Peter 和 Smith 的职务相同。上面的查询返回了以下记录:
a_empname b_empname
Adam Adam
Smith Smith
Peter Smith
Smith Peter
Peter Peter
要在 select 列 a.empname 上获得所需的结果,您应该在 b.empname 列上进行过滤,反之亦然。
所以以下任一查询都可以工作:
SELECT a.empname
FROM employee a
JOIN employee b ON(a.designation = b.designation)
WHERE b.empname="Peter";
SELECT b.empname
FROM employee a
JOIN employee b ON(a.designation = b.designation)
WHERE a.empname="Peter";
我猜 技术上 因为你有 CONDITION : without directly using the designation of Peter in the WHERE CLAUSE.
你可以使用:
SELECT *
FROM mytable t1
INNER JOIN mytable t2 ON t1.condition = t2.condition
AND t2.name = 'Peter'
您有匹配 Peter 的记录,但没有在 WHERE
子句中使用 "Peter"。
Oracle 11g R2 架构设置:
CREATE TABLE table1 (name varchar(10), condition1 varchar(10));
INSERT INTO table1 (name, condition1)
SELECT 'Peter', 'c1' FROM dual UNION ALL
SELECT 'Paul', 'c2' FROM dual UNION ALL
SELECT 'Mary', 'c1' FROM dual UNION ALL
SELECT 'Jay', 'c2' FROM dual UNION ALL
SELECT 'SilentBob', 'c1' FROM dual UNION ALL
SELECT 'Bill', 'c1' FROM dual UNION ALL
SELECT 'Ted', 'c4' FROM dual UNION ALL
SELECT 'Rufus', 'c3' FROM dual
;
查询 1:
SELECT *
FROM table1 t1
INNER JOIN table1 t2 ON t1.condition1 = t2.condition1
AND t2.name = 'Peter'
| NAME | CONDITION1 | NAME | CONDITION1 |
|-----------|------------|-------|------------|
| Peter | c1 | Peter | c1 |
| Mary | c1 | Peter | c1 |
| SilentBob | c1 | Peter | c1 |
| Bill | c1 | Peter | c1 |
虽然此查询根据您的条件给出了结果,但没有 where clouse 请注意,此查询在性能方面不会很好,我不建议您在生产中使用它。
Select * from employee e
Inner join designation d on (e.designationid=
d.designationid ) and (e.designation =(select
distinct designation from employee e1 inner
join designation d1 on (e1.designationid
=d1.designationid ) and e.name like 'peter' )
使用内部联接
显示与 "Peter" 具有相同名称的记录条件:没有在 WHERE 子句中直接使用 Peter 的名称。
假设你有像 table1 table1_name,attribute1,attribute2 和 table 像 table2_name, attribute1,..., name 属性会就像一个id(通过table)
然后
SELECT * FROM table1 inner join table2 on table1_name = table2_name
尝试以下操作:
SELECT t2.Name, t2.Designation
FROM table1 t1
INNER JOIN table1 t2
ON t1.Designation = t2.Designation
WHERE t1.Name = 'Peter'
FETCH NEXT 2 ROWS ONLY
它在列 Designation
上加入 2 tables(相同的 table),过滤 peter 指定的结果并仅获取前 2 行。
内部联接 selects 匹配来自 tables 的行。要了解此处的问题,请尝试以下 SQL.
SELECT a.empname as a_empname, b.empname b_empname
FROM employee a
JOIN employee b ON(a.designation = b.designation);
我的 table 中有 Adam、Peter 和 Smith 三名员工,Peter 和 Smith 的职务相同。上面的查询返回了以下记录:
a_empname b_empname
Adam Adam
Smith Smith
Peter Smith
Smith Peter
Peter Peter
要在 select 列 a.empname 上获得所需的结果,您应该在 b.empname 列上进行过滤,反之亦然。
所以以下任一查询都可以工作:
SELECT a.empname
FROM employee a
JOIN employee b ON(a.designation = b.designation)
WHERE b.empname="Peter";
SELECT b.empname
FROM employee a
JOIN employee b ON(a.designation = b.designation)
WHERE a.empname="Peter";
我猜 技术上 因为你有 CONDITION : without directly using the designation of Peter in the WHERE CLAUSE.
你可以使用:
SELECT *
FROM mytable t1
INNER JOIN mytable t2 ON t1.condition = t2.condition
AND t2.name = 'Peter'
您有匹配 Peter 的记录,但没有在 WHERE
子句中使用 "Peter"。
Oracle 11g R2 架构设置:
CREATE TABLE table1 (name varchar(10), condition1 varchar(10));
INSERT INTO table1 (name, condition1)
SELECT 'Peter', 'c1' FROM dual UNION ALL
SELECT 'Paul', 'c2' FROM dual UNION ALL
SELECT 'Mary', 'c1' FROM dual UNION ALL
SELECT 'Jay', 'c2' FROM dual UNION ALL
SELECT 'SilentBob', 'c1' FROM dual UNION ALL
SELECT 'Bill', 'c1' FROM dual UNION ALL
SELECT 'Ted', 'c4' FROM dual UNION ALL
SELECT 'Rufus', 'c3' FROM dual
;
查询 1:
SELECT *
FROM table1 t1
INNER JOIN table1 t2 ON t1.condition1 = t2.condition1
AND t2.name = 'Peter'
| NAME | CONDITION1 | NAME | CONDITION1 |
|-----------|------------|-------|------------|
| Peter | c1 | Peter | c1 |
| Mary | c1 | Peter | c1 |
| SilentBob | c1 | Peter | c1 |
| Bill | c1 | Peter | c1 |
虽然此查询根据您的条件给出了结果,但没有 where clouse 请注意,此查询在性能方面不会很好,我不建议您在生产中使用它。
Select * from employee e
Inner join designation d on (e.designationid=
d.designationid ) and (e.designation =(select
distinct designation from employee e1 inner
join designation d1 on (e1.designationid
=d1.designationid ) and e.name like 'peter' )