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 состоит в том, чтобы избавиться от третьей повторяющейся записи, с которой не связан сотрудник. Результат должен иметь только первые две записи из поля результата изображения.
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 содержит значения из нескольких столбцов.