SQL SELECT DISTINCT Subquery Error: 1241

SQL SELECT DISTINCT Subquery Error: 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 子查询的原因是删除没有关联工作人员的第三个重复条目。结果应该只有图片结果字段中的前两个条目。

剪断:

... 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 时尝试 select,但在您的 not in 查询中指定了多个 select 行。刚刚 select company:

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

您的 IN 列表应包含来自一列的值,pc.company。但是您的 IN 列表包含来自多个列的值。

如果要保留给定项目的所有行,请使用 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'

我有点困惑 table 应该放在第一位 -- 但我认为这是所有公司而不是所有项目。如果是这样,这是没有 WHERE:

FROM 子句
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;