代码之家  ›  专栏  ›  技术社区  ›  CheeseConQueso

SQL Server 2005右外部联接不工作

  •  7
  • CheeseConQueso  · 技术社区  · 15 年前

    我正在查找特定课程的访问日志。我需要显示所有的课程,即使它们不在日志表中。因此,外部连接……但是在尝试了 LEFT OUTER , RIGHT OUTER , INNER 在SQL代码中放置表,我无法得到我的结果。

    以下是我的跑步记录:

    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 阻止我获得LSN日志中不存在的课程ID的条款?这是我入席的方式吗?

    再说一次,简而言之,我想要所有的课程ID,不管它们是否存在于LSN日志中。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Anthony Faull    15 年前
    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...
    
        2
  •  8
  •   Quassnoi    15 年前

    在WHERE子句中是否有阻止我获取LSN日志中不存在的课程ID的内容?

    是的,是的。

    你在你的 WHERE 有效过滤掉 NULL 由生成的行 OUTER 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
    
        3
  •  2
  •   Andomar    15 年前

    为了扩展Quassnoi的好答案,对于外部加入工作,您可以更改:

    AND l.user_id = a.username
    

    到:

    AND (l.user_id is null OR l.user_id = a.username)
    
        4
  •  1
  •   Joe Ratzer    15 年前

    SQL Server 2005右外部联接当然有效!:)

    以下是什么(我做了一些假设)?:

    去除

    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_日志和帐户字段添加一些空检查,例如:

    (l.object_id IS NULL OR l.object_id = 'LOGIN')
    
        5
  •  0
  •   CheeseConQueso    15 年前

    这最终奏效了

    Joe 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