SQL SELECT DISTINCT Ошибка подзапроса: 1241

Я работаю над длинным запросом, который включает в себя SELECT DISTINCT и подзапрос. Это частично работает, но не когда вместе. Я получаю сообщение об ошибке: 1241 - Операнд должен содержать 1 столбец (столбцы), и я не могу понять, почему. Любая помощь будет принята с благодарностью.

Вот мой код:

SELECT p.projId, pc.company, s.staffId, s.fName, s.lName
    FROM projects AS p
    INNER JOIN projCorp AS pc ON p.projId = pc.projId
    INNER JOIN projStaff AS ps ON p.projId = ps.projId
    INNER JOIN staff AS s ON ps.staffId = s.StaffId
    WHERE p.projId = '9' AND s.company = pc.company
UNION
    SELECT DISTINCT p.projId, pc.company, "NA", "NA", "NA"
    FROM projects AS p
    INNER JOIN projCorp AS pc ON p.projId = pc.projId
    INNER JOIN projStaff AS ps ON p.projId = ps.projId
    WHERE p.projId = '9' AND pc.company NOT IN (SELECT p.projId, pc.company, s.staffId, s.fName, s.lName
        FROM projects AS p
        INNER JOIN projCorp AS pc ON p.projId = pc.projId
        INNER JOIN projStaff AS ps ON p.projId = ps.projId
        INNER JOIN staff AS s ON ps.staffId = s.StaffId
        WHERE p.projId = '9' AND s.company = pc.company);

Без подзапроса NOT IN я получаю такой результат:

результат без NOT IN подзапроса

Причина подзапроса NOT IN состоит в том, чтобы избавиться от третьей повторяющейся записи, с которой не связан сотрудник. Результат должен иметь только первые две записи из поля результата изображения.

3 ответа

Решение

Надрез:

... WHERE p.projId = '9' AND pc.company NOT IN (
        SELECT p.projId, pc.company, s.staffId, s.fName, s.lName
        FROM projects AS p ....
    )

Вы пытаетесь выбрать, когда company not in но указывается более одной выбранной строки из вашего not in запрос. Просто выберите company:

... WHERE p.projId = '9' AND pc.company NOT IN (
        SELECT pc.company
        FROM projects AS p ....
    )

Если вы хотите сохранить все строки для данного проекта, используйте left join:

SELECT p.projId, pc.company, s.staffId, s.fName, s.lName
FROM projects p LEFT JOIN
     projCorp pc
     ON p.projId = pc.projId LEFT JOIN
     projStaff ps
     ON p.projId = ps.projId LEFT JOIN
     staff s
     ON ps.staffId = s.StaffId AND s.company = pc.company
WHERE p.projId = '9'; 

Это кажется более разумным, чем сложный union запрос. Ты можешь использовать coalesce() преобразовать NULL значения для 'NA', если это действительно желательно.

Я немного озадачен тем, какой стол должен идти первым, но я думаю, что это все компании, а не все проекты. Если так, то это FROM пункт без WHERE:

FROM projCorp pc LEFT JOIN
     projects p   
     ON p.projId = pc.projId AND p.projId = '9' LEFT JOIN
     projStaff ps
     ON p.projId = ps.projId LEFT JOIN
     staff s
     ON ps.staffId = s.StaffId AND s.company = pc.company;

Ваш список IN должен содержать значения из одного столбца, pc.company. Но ваш список IN содержит значения из нескольких столбцов.

Другие вопросы по тегам