【问题标题】:SQL Correlated Subquery in SelectSelect 中的 SQL 相关子查询
【发布时间】:2017-11-24 03:36:30
【问题描述】:

是否可以像这样在 SELECT 中创建关联子查询?

SELECT  EmployeeID,
EmployeeName,
ManagerID,
    (SELECT EmployeeName FROM tblEmployee WHERE EmployeeID = ManagerID)
FROM tblEmployee 
WHERE EmployeeID = '12345';


ManagerID 应该相等,并且应该是员工“12345”的 ManagerID。
子查询的目的是根据经理的 ID 获取经理的全名。

非常感谢您的回复。
我是新手。

谢谢,
黑麦。

【问题讨论】:

    标签: mysql sql database oracle correlated-subquery


    【解决方案1】:

    是的。为了简化您的 SQL 编写,当您的查询有多个表引用时,请记住始终限定所有列名:

    SELECT e.EmployeeID, e.EmployeeName, e.ManagerID,
           (SELECT m.EmployeeName
            FROM tblEmployee m
            WHERE m.EmployeeID = e.ManagerID
           )
    FROM tblEmployee e
    WHERE e.EmployeeID = '12345';
    

    【讨论】:

    • 感谢您的回复。这是一个更简单但更容易理解/准备好的查询
    • 我应该在 m.EmployeeName 之前添加 DISTINCT 关键字吗?
    • 否 - 如果 tblEmployee.EmployeeID 具有有效的唯一约束,则保证子查询最多返回 1 行。
    【解决方案2】:

    试试这个,

    DECLARE @tblEmployee TABLE(EmployeeID INT,EmployeeName VARCHAR(100),ManagerID INT)
    INSERT INTO @tblEmployee VALUES(1,'Arun',2)
    INSERT INTO @tblEmployee VALUES(2,'Dinesh',NULL)
    
    
    SELECT  EmployeeID,
    EmployeeName,
    ManagerID,
        (SELECT M.EmployeeName FROM @tblEmployee M WHERE T1.ManagerID = M.EmployeeID)ManagerName
    FROM @tblEmployee T1
    WHERE EmployeeID = 1;
    

    【讨论】:

    • 感谢您的回复。我真的很感激
    【解决方案3】:

    我通过这个查询得到了数据。

    SELECT e.EmployeeID, e.EmployeeName, e.ManagerID, m.EmployeeName as ManagerName 
    FROM tblEmployee e 
    JOIN tblEmployee m
    ON e.ManagerID = m.EmployeeID
    WHERE e.EmployeeID = '12345';
    

    感谢所有发布回复的人。
    没有你们,永远不会解决它。

    谢谢,
    黑麦

    【讨论】: