2

我正在处理一个包含 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 子查询的原因是为了摆脱没有关联员工的第三个重复条目。结果应该只有图片结果字段中的前两个条目。

4

3 回答 3

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 ....
    )
于 2015-11-11T19:07:02.987 回答
2

如果要保留给定项目的所有行,请使用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没有 no 的子句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;
于 2015-11-11T19:14:29.070 回答
0

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

于 2015-11-11T19:07:55.047 回答