2013-10-20 52 views
0

有兩個表格JOBWORKER選擇不符合條件的物品

JOB表

  • JOBID

WORKER表

  • WORKERID
  • JOBID(FK從JOB表)
  • 假期( 'Y' 或 'N' )

有了這兩個表格,我想查找一個沒有工人分配的作業列表。 我做了以下查詢,但由於聚合函數SUMCASE 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 
+0

請更改你的標籤並添加tsql。 –

回答

1

選擇* 從工作 如果作業ID不在(選擇工人不同作業ID)

完蛋了。

+0

除了OP的查詢還會*選擇那些所有員工都在度假的工作,因爲您的查詢只會選擇那些沒有分配工作人員的工作。 – pete

+0

這是沒有工人分配的工作清單。那麼你的問題是什麼? –

+1

它的工作原理! VACATION標誌沒有在你的答案中提到,但我只是在選擇不同的子查詢上添加了標誌檢查。 – Heejin

1

看一看這裏,希望它有助於

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例如:EXAMPLE

+0

除OP之外的查詢還會*選擇那些所有員工都在度假的工作,因爲您的查詢只會選擇那些沒有分配工作人員的工作。您的sqlFiddle應該返回作業1,2,3和4,因爲作業1,2和4中的所有工人正在休假。 – pete

+1

你是對的,謝謝你指出。代碼已更新 – BeNdErR

0

我這樣做:

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