7

特定のコースのアクセスログを調べています。ログ テーブルに存在しない場合でも、すべてのコースを表示する必要があります。したがって、外部結合....しかし、(おそらく) SQL コード内のLEFT OUTERRIGHT OUTER、およびテーブルの配置のすべてのバリエーションを試した後、結果を得ることができませんでした。INNER

これが私が実行しているものです:

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

WHERElsn_logs に存在しない course_id を取得することを妨げているのは、句の中にありますか? それは私がテーブルに参加している方法ですか?

繰り返しますが、要するに、lsn_logs に存在するかどうかに関係なく、すべての course_id が必要です。

4

5 に答える 5

8

lsn_logsに存在しないcourse_idを取得するのを妨げているのは、WHERE句の何かですか?

はい、そうです。

句で等式条件を使用して、によって生成された行WHEREを効果的に除外します。NULLOUTER JOIN

アップデート:

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
于 2010-05-20T13:59:26.063 に答える
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...
于 2010-05-20T15:12:47.800 に答える
2

Quassnoi の良い答えを拡張するには、外部結合が機能するように変更できます。

AND l.user_id = a.username

に:

AND (l.user_id is null OR l.user_id = a.username)
于 2010-05-20T14:09:41.210 に答える
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 および account フィールドにいくつかの null チェックを追加します。

(l.object_id IS NULL OR l.object_id = 'LOGIN')
于 2010-05-20T14:26:02.927 に答える
0

これは最終的に機能しました

Joe Rが提案したnullチェックは、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
于 2010-05-20T14:55:34.677 に答える