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