2016-09-10 149 views
1

我尝试构建具有多个列的子查询。像这样:具有多个列的子查询

--SELF JOIN: 
WITH Employees AS 
(
    SELECT 
     e.EmployeeID, e.ManagerID, e.Title, 
     c.FirstName + ISNULL(' ' + c.MiddleName,'') + ' ' + c.LastName AS EmpName 
    FROM 
     Employee AS e 
    INNER JOIN 
     Contact AS c ON e.ContactID = c.ContactID 
) 
SELECT 
    emp.EmployeeID, emp.ManagerID, emp.EmpName, emp.Title AS EmpTitle, 
    mgr.EmpName as MgrName, mgr.Title as MgrTitle 
FROM 
    Employees AS Emp 
INNER JOIN 
    Employees AS Mgr ON Emp.ManagerID = Mgr.EmployeeID; 

--2 
WITH Employees AS 
(
    SELECT 
     e.EmployeeID, e.ManagerID, e.Title, 
     c.FirstName + ISNULL(' ' + c.MiddleName,'') + ' ' + c.LastName AS EmpName 
    FROM 
     Employee AS e 
    INNER JOIN 
     Contact AS c ON e.ContactID = c.ContactID 
) 
SELECT 
    EmployeeID, ManagerID, EmpName, Title 
FROM 
    Employees 
WHERE 
    EmployeeID IN (SELECT EmployeeID, er2.MaritalStatus 
        FROM Employees AS e 
        INNER JOIN AdventureWorks2012.HumanResources.Employee AS er2 ON e.ManagerID = er2.BusinessEntityID 
        WHERE er2.MaritalStatus = 'M'); 

我也想显示MarialStatus。但我不能做这种方式,因为我得到的错误:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

,但如果我不能做到这一点的子查询存在。所以我的问题是:我可以在子查询中选择多于一列的正确方法是什么?

谢谢

+0

为什么会有人用'tempdb'物理表 –

+0

@Prdp看起来像OP与AdventureWorks的数据实验。 OP? –

+0

?你对OP的含义是什么? – SavantCode

回答

1

你不能在一个子返回2个值query.So你将不得不删除MaritalStatus列。这是你的查询的问题。

USE tempdb; 
WITH 
Employees AS(
SELECT e.EmployeeID, e.ManagerID,e.Title, 
c.FirstName + ISNULL(' ' + c.MiddleName,'') + ' ' + c.LastName AS EmpName 
FROM Employee AS e 
INNER JOIN Contact AS c 
ON e.ContactID = c.ContactID 
) 
SELECT emp.EmployeeID, emp.ManagerID, emp.EmpName, emp.Title AS EmpTitle, 
mgr.EmpName as MgrName, mgr.Title as MgrTitle 
FROM Employees AS Emp INNER JOIN Employees AS Mgr 
ON Emp.ManagerID = Mgr.EmployeeID; 
--2 
WITH Employees AS (
SELECT e.EmployeeID, e.ManagerID,e.Title, 
c.FirstName + ISNULL(' ' + c.MiddleName,'') + ' ' + c.LastName AS EmpName 
FROM Employee AS e 
INNER JOIN Contact AS c 
ON e.ContactID = c.ContactID) 

SELECT e.EmployeeID, e.ManagerID, e.EmpName, e.Title,er2.MaritalStatus 
FROM Employees e 
INNER JOIN AdventureWorks2012.HumanResources.Employee AS er2 
ON e.ManagerID = er2.BusinessEntityID 
WHERE er2.MaritalStatus = 'M'); 

我不认为你需要一个子查询那里,因为INNER JOIN会给你只的记录,如果有一个匹配。所以做一个INNER JOIN来回表,并把MaritalStatus列在选择子句

+0

啊,谢谢。非常好 – SavantCode

+0

我已经做到了。你看到了吗? – SavantCode

1

该问题似乎在您的第二个查询。第二列在SELECT中不是必需的。但是,你还可以通过去除JOIN简化的逻辑:

SELECT e.EmployeeID, e.ManagerID, e.EmpName, e.Title 
FROM Employees e 
WHERE e.ManagerID IN (SELECT er2.BusinessEntityID 
         FROM AdventureWorks2012.HumanResources.Employee er2 
         WHERE er2.MaritalStatus = 'M' 
        );