2011-04-12 47 views
0

我有一個包含三個表的數據庫。 「名冊」,「培訓課程」和「課程註冊」 名冊和課程註冊通過「ETID」(員工培訓ID)連接。課程註冊和培訓課程由「課程ID」連接。
我想創建一個將返回所有員工的查詢,以及所有課程的YES/NO值。 我寫了以下內容來看看特定員工,但我似乎找不到正確的方式來退回所有員工。任何幫助,將不勝感激。試圖創建一個將返回所有記錄的查詢讓我難住

SELECT [TRAINING COURSES].[course id] 
    , [TRAINING COURSES].[course name] 
    , "YES" AS Completed 
    , [COURSE ENROLLMENT].[training date] 
FROM [TRAINING COURSES] 
INNER JOIN [COURSE ENROLLMENT] 
      ON [COURSE ENROLLMENT].[course id]=[TRAINING COURSES].[course id] 
WHERE [COURSE ENROLLMENT].[ETID]=[ENTER ETID] 

UNION ALL 

SELECT [TRAINING COURSES].[course id] 
    , [TRAINING COURSES].[course name] 
    , "No" AS Completed 
    , NULL 
FROM [TRAINING COURSES] 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM [COURSE ENROLLMENT] 
    WHERE [COURSE ENROLLMENT].[course id]=[TRAINING COURSES].[course id] 
    AND [COURSE ENROLLMENT].[ETID]=[ENTER ETID:] 
) 
ORDER BY [TRAINING COURSES].[course name]; 
+2

請注意:如果您使用Pascal格式,您的查詢將更容易讀寫:'CourseEnrollment'而不是'[COURSE ENROLLMENT]'。你可能更喜歡下劃線('Course_Enrollment'),但坦率地說,任何事情都比包圍每個表格和每個字段都好。 – 2011-04-12 16:43:36

+0

訪問,恕我直言,最大的罪惡之一是它允許對象名稱中的空格。而且我不是一個自反的Access-basher .... – RolandTumble 2011-04-12 18:27:25

+0

我是一名全職Access開發人員,自從我使用它的頭幾年以來,我沒有在對象名稱中使用空格。在很短的時間之後,它就變得很明顯,那裏沒有實用性。許多人將對象名稱與表示層名稱混淆,其中大多數可以在對象定義中定義(如表中字段的標題屬性)。 – 2011-04-13 01:39:43

回答

0

從兩個子查詢中刪除WHERE [COURSE ENROLLMENT].[ETID]=[ENTER ETID]

3

在此查詢中不需要使用Union。將INNER JOIN替換爲LEFT OUTER JOIN,它將完成與查詢相同的操作,但性能會更好。

SELECT [Training Courses].[Course Id], [Training Courses].[Course Name], 
     IIF(IsNull([Course Enrollment].[ETID]), "NO", "YES") as Completed, 
     [Course Enrollment].[Training Date] 
FROM [Training Courses] 
     LEFT OUTER JOIN [Course Enrollment] 
      ON [Training Courses].[Course Id] = [Course Enrollment].[Course Id] 
ORDER BY [Training Courses].[Course Name] 

如果你希望所有的員工,所有的課程,你需要做的花名冊和培訓課程表之間的交叉連接。然後,您將在課程註冊表中進行左連接,以獲得上述的「是」。

相關問題