我应该使用自加入吗

问题描述 投票:0回答:4

如果我有一张桌子...

  ID     Name   Manager 
  0      Joe    Sue  
  1      Jake   Tom
  0      Joe    Tom
  2      Larry  Red
  2      Larry  Paul
  1      Jake   Paul

我希望输出是......

 ID   Name   Manager1    Manager2
 0    Joe    Sue         Tom
 1    Jake   Tom         Paul
 2    Larry  Red         Paul

谢谢...

sql
4个回答
4
投票

如果我正确理解了您的请求,是的,类似的东西会产生您正在寻找的结果。

SELECT
t1.Name Name,
t1.Manager Manager1,
t2.Manager Manager2
FROM
Table t1
inner join Table t2 on t1.Manager = t2.Name

当然,返回索引列的外键将优先于性能的强比较。


3
投票

是的,如果您的桌子被称为“经理”:

SELECT Mgr1.ID,Mgr1.Name,Mgr1.Manager,Mgr2.Manager
FROM Managers AS Mgr1
LEFT JOIN Managers AS Mgr2
ON Mgr1.ID=Mgr2.ID

0
投票

如果您保留表,则最好进行连接。

如果你讨厌连接,你可以组合最大和最小经理,即使这样,如果总是有 2 个经理并且他们不能有相同的名称,它也会起作用。

如果我记得如何正确连接 2 个查询,下面的代码应该可以工作。但我建议看看是否可以重新设计您的表格,建立一个单独的表格,在经理员工关系中将人们相互连接起来。

SELECT DISTINCT 
    F.ID, F.Name, S.Manager, F.Manager
FROM 
    (SELECT 
         ID, Name, MIN(manager) manager 
     FROM Managers 
     GROUP BY ID, Name) F,
    (SELECT
         ID, Name, MAX(manager) manager 
     FROM Managers 
     GROUP BY ID, Name) S
WHERE 
    F.ID = S.ID
    AND S.Manager <> F.Manager
    AND F.ID < S.ID

0
投票

如果我使用MySql进行回答。我同意Andy的回答,但稍作修改,就像这样的代码:

-- DDL Schema SQL
CREATE TABLE Managers  (
  `ID` INTEGER,
  `Name` VARCHAR(5),
  `Manager` VARCHAR(4)
);

INSERT INTO Managers 
  (`ID`, `Name`, `Manager`)
VALUES
  ('0', 'Joe', 'Sue'),
  ('1', 'Jake', 'Tom'),
  ('0', 'Joe', 'Tom'),
  ('2', 'Larry', 'Red'),
  ('2', 'Larry', 'Paul'),
  ('1', 'Jake', 'Paul');
-- DQL Query SQL
SELECT DISTINCT 
    F.ID, F.Name, S.Manager, F.Manager
FROM 
    (SELECT 
         ID, Name, MIN(manager) manager 
     FROM Managers  
     GROUP BY ID, Name) F,
    (SELECT
         ID, Name, MAX(manager) manager 
     FROM Managers  
     GROUP BY ID, Name) S
WHERE 
    F.ID = S.ID
-- The others SQL Database manager maybe?
    -- AND S.Manager <> F.Manager
    -- AND F.ID < S.ID

如果您想查看 MySQL 数据库演示,请单击 DB-Fiddle.com 上的此链接

© www.soinside.com 2019 - 2024. All rights reserved.