Sql 选择不符合条件的项目

Sql 选择不符合条件的项目,sql,tsql,Sql,Tsql,有两张桌子,分别是JOB和WORKER 工作表 若比德 工作表 工蚁 作业表中的作业ID FK 假期“Y”或“N” 通过这两个表,我想找到一个没有工人分配的工作列表。 我进行了以下查询,但由于聚合函数SUM和CASE WHEN,它似乎效率低下且冗长 还有比这更好的问题吗 SELECT SUBQUERY.JOBID FROM ( SELECT JOBID, SUM ( CASE WHEN

有两张桌子,分别是JOB和WORKER

工作表

若比德 工作表

工蚁 作业表中的作业ID FK 假期“Y”或“N” 通过这两个表,我想找到一个没有工人分配的工作列表。 我进行了以下查询,但由于聚合函数SUM和CASE WHEN,它似乎效率低下且冗长

还有比这更好的问题吗

SELECT
    SUBQUERY.JOBID
FROM
(
    SELECT
        JOBID,
        SUM
        (
            CASE WHEN
                VACATION = 'N'
            THEN 1
            ELSE 0
            END
        ) NUM_WORKERS
    FROM
        JOB
    LEFT JOIN
        WORKER
    ON
        JOB.JOBID = WORKER.JOBID
    GROUP BY
        JOB.JOBID
) SUBQUERY
WHERE
    SUBQUERY.NUM_WORKERS = 0
选择* 从工作 如果jobid不在中,请从worker中选择不同的jobid


就是这样。

看看这里,希望能有所帮助

SELECT JOBID 
FROM JOB 
WHERE JOBID NOT IN (
    SELECT j.JOBID 
    FROM JOB j 
    JOIN WORKER w ON j.JOBID = w.JOBID
    WHERE w.VACATION = 'N'
    GROUP BY j.JOBID
)
Sqlfiddle示例:

我将使用以下方法:

SELECT j.jobid 
FROM job AS j
WHERE NOT EXISTS
      ( SELECT 1
        FROM worker AS w 
        WHERE w.vacation = 'N'
          AND w.jobid = j.jobid
      ) ;
或者这个:

SELECT j.jobid 
FROM job AS j

EXCEPT

SELECT w.jobid
FROM worker AS w 
WHERE w.vacation = 'N' ;

除此之外,OP的查询还将选择所有员工都在休假的工作,其中作为您的查询,您的查询将仅选择未分配员工的工作。sqlFiddle应返回作业1、2、3和4,因为作业1、2和4中的所有员工都在休假。除了OP的查询外,还将选择所有员工都在休假的作业,其中作为您的查询,将仅选择未分配员工的作业。这是未分配员工的作业列表。那你的问题是什么?它起作用了!您的答案中没有提到假期标志,但我只是在select distinct子查询中添加了标志检查。请更改标记并添加tsql。