简体   繁体   English

SQL SELECT DISTINCT子查询错误:1241

[英]SQL SELECT DISTINCT Subquery Error: 1241

I am working on a long query that includes a SELECT DISTINCT and subquery. 我正在处理包含SELECT DISTINCT和子查询的长查询。 It is partially working, but not when put together. 它可以部分工作,但不能一起使用。 I am getting a Error: 1241 - Operand should contain 1 column(s) and I cannot see why. 我收到一个错误:1241-操作数应包含1列,而我看不到为什么。 Any help would be greatly appreciated. 任何帮助将不胜感激。

Here is my code: 这是我的代码:

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);

Without the NOT IN subquery, I am getting this result: 没有NOT IN子查询,我得到以下结果:

没有NOT IN子查询的结果

The reason for the NOT IN subquery is to get rid of the third duplicate entry that doesn't have a staff member associated. NOT IN子查询的原因是要消除没有工作人员相关联的第三个重复条目。 The result should just have the first two entries from the picture result field. 结果应仅包含图片结果字段中的前两个条目。

Snip: 剪断:

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

You're trying to select when company not in but there are specifying more than one selected row from within your not in query. 您正在尝试选择company not in但是在您not in查询中指定了多个选定行。 Just select company : 只需选择company

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

If you want to keep all the rows for a given projects, use a left join : 如果要保留给定项目的所有行,请使用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'; 

This seems more sensible than a complicated union query. 这似乎比复杂的union查询更明智。 You can use coalesce() to convert the NULL values to 'NA' , if that really is desirable. 如果确实需要,可以使用coalesce()NULL值转换为'NA'

I am a little confused on which table should go first -- but I'm thinking it is all companies as opposed to all projects. 我对应该首先使用哪个表感到有些困惑-但我认为这是所有公司而非所有项目的结果。 If so, this is the FROM clause with no WHERE : 如果是这样,这是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;

Your IN list should contain values from one column, pc.company. 您的IN列表应包含pc.company一栏中的值。 But your IN list contains values from multiple columns. 但是您的IN列表包含来自多个列的值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM