2016-09-10 5 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. –

+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 в предложение select

+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' 
        ); 
Смежные вопросы