2010-05-20 77 views
7

我正在查閱特定課程的訪問日誌。即使日誌表中不存在,我也需要顯示所有課程。因此,外連接....但在嘗試(假定)所有的變化LEFT OUTER,RIGHT OUTER, INNER和SQL代碼中的表的位置後,我無法得到我的結果。SQL Server 2005 RIGHT OUTER JOIN不能正常工作

這裏是我運行:

SELECT (a.first_name+' '+a.last_name) instructor, 
      c.course_id, 
      COUNT(l.access_date) course_logins, 
      a.logins system_logins, 
      MAX(l.access_date) last_course_login, 
      a.last_login last_system_login 
FROM  lsn_logs l RIGHT OUTER JOIN courses c ON l.course_id = c.course_id, 
      accounts a 
WHERE  l.object_id = 'LOGIN' 
      AND c.course_type = 'COURSE' 
      AND c.course_id NOT LIKE '%TEST%' 
      AND a.account_rights > 2 
      AND l.user_id = a.username 
      AND ((a.first_name+' '+a.last_name) = c.instructor) 
GROUP BY c.course_id, 
      a.first_name, 
      a.last_name, 
      a.last_login, 
      a.logins, 
      c.instructor 
ORDER BY a.last_name, 
      a.first_name, 
      c.course_id, 
      course_logins DESC 

有什麼事情的WHERE子句問題,導致我獲得COURSE_ID的是不lsn_logs存在?這是我加入桌子的方式嗎?

再次,簡而言之,我希望所有的course_id無論在lsn_logs中是否存在。

+0

如果你也許會尋找在做左從課程加盟lsn_logs照顧的問題? – Shaded 2010-05-20 14:01:05

+0

您正在使用'lsn_logs'加入帳戶。如果給定課程沒有log_entry,應該返回哪個帳戶? – Quassnoi 2010-05-20 14:04:53

+0

@quassnoi - 課程的講師 – CheeseConQueso 2010-05-20 14:52:41

回答

2
SELECT...  
FROM courses c 
    INNER JOIN accounts a 
     ON (a.first_name+' '+a.last_name) = c.instructor 
    LEFT OUTER JOIN lsn_logs l 
     ON l.course_id = c.course_id 
     AND l.user_id = a.username 
     AND l.object_id = 'LOGIN' 
WHERE c.course_type = 'COURSE' 
    AND c.course_id NOT LIKE '%TEST%' 
    AND a.account_rights > 2 
    AND a.logins > 0 
GROUP BY... 
ORDER BY... 
+0

好 - 這與我的工作原理相同,但省去了所有的空檢查 – CheeseConQueso 2010-05-20 15:22:58

+0

你的解決方案返回1386和我的返回1358 ...我必須調查 – CheeseConQueso 2010-05-20 15:46:37

8

是否在WHERE子句中阻止我獲取lsn_logs中不存在的course_id?

是的。

您在您的WHERE子句中使用了相等條件,可以有效地過濾OUTER JOIN生成的NULL行。

更新:

SELECT c.instructor, 
     c.course_id, 
     l.course_logins, 
     a.logins system_logins, 
     l.last_course_login, 
     a.last_login last_system_login 
FROM courses с 
JOIN accounts a 
ON  a.first_name + ' ' + a.last_name = c.instructor 
CROSS APPLY 
     (
     SELECT COALESCE(COUNT(access_date), 0) course_logins, 
       MAX(access_date) last_course_login 
     FROM lsn_logs l 
     WHERE l.object_id = 'LOGIN' 
       AND l.course_id = c.course_id 
       AND l.user_id = a.username 
     ) l 
WHERE c.course_type = 'COURSE' 
     AND c.course_id NOT LIKE '%TEST%' 
     AND a.account_rights > 2 
ORDER BY 
     a.last_name, 
     a.first_name, 
     c.course_id, 
     course_logins DESC 
+0

多數民衆贊成在什麼我想......我認爲喬和/或爭論回答可能工作,但謝謝你的澄清 – CheeseConQueso 2010-05-20 14:38:30

+0

@cheese:你能否在我的評論中回答你的帖子中的問題? – Quassnoi 2010-05-20 14:47:08

2

要擴大Quassnoi的很好的答案,對於外連接工作,你可以改變:

AND l.user_id = a.username 

要:

AND (l.user_id is null OR l.user_id = a.username) 
+0

賬戶和課程表將始終具有匹配的記錄,但lsn_logs是空的一些課程和/或賬戶 – CheeseConQueso 2010-05-20 14:47:06

+0

空/或在lsn_logs表連擊需要注意的問題 – CheeseConQueso 2010-05-20 14:58:18

+0

@CheeseConQueso:答案編輯,以便它只是檢查空在lsn_logs表 – Andomar 2010-05-20 14:59:12

1

的SQL Server 2005 RIGHT OUTER JOIN當然有效! :)

有關以下(我做了一些假設)?:

什麼去除

AND l.user_id = a.username 

,改變加入到

dbo.courses c 
LEFT OUTER JOIN lsn_logs l 
ON c.course_id = l.course_id 
LEFT OUTER JOIN accounts a 
ON l.user_id = a.username 

,並添加一些空檢查lsn_logs和帳戶字段,例如:

(l.object_id IS NULL OR l.object_id = 'LOGIN') 
+0

順便說一句,你有一個非常令人不安的照片! :) – 2010-05-20 14:29:42

+0

它的一個好辦法令人不安雖然...感謝您的建議,我認爲你的雙外聯接可能工作 – CheeseConQueso 2010-05-20 14:37:00

+0

仍然相同的結果集......我看你用這雖然 – CheeseConQueso 2010-05-20 14:41:23

0

這結束了工作

空支票喬 - [R建議把該Quassnoi提到

SELECT (a.first_name+' '+a.last_name) instructor, 
      c.course_id, 
      COUNT(l.access_date) course_logins, 
      a.logins system_logins, 
      MAX(l.access_date) last_course_login, 
      a.last_login last_system_login 
FROM  lsn_logs l RIGHT OUTER JOIN courses c ON l.course_id = c.course_id, 
      accounts a 
WHERE  (l.object_id IS NULL OR l.object_id = 'LOGIN') 
      AND c.course_type = 'COURSE' 
      AND c.course_id NOT LIKE '%TEST%' 
      AND a.account_rights > 2 
      AND (l.user_id = a.username OR l.user_id IS NULL) 
      AND ((a.first_name+' '+a.last_name) = c.instructor) 
      AND a.logins > 0 
GROUP BY c.course_id, 
      a.first_name, 
      a.last_name, 
      a.last_login, 
      a.logins, 
      c.instructor 
ORDER BY a.last_name, 
      a.first_name, 
      c.course_id, 
      course_logins DESC 
+0

順便說一句 - 有可能是一個更好的方式來做到這一切中的'FROM'部分....請張貼任何修改 – CheeseConQueso 2010-05-20 14:56:27

+0

,這將引發和錯誤「SqlClient數據提供程序錯誤號8153」,但仍然返回結果....必須看看 – CheeseConQueso 2010-05-20 15:01:30