Left Join不显示缺失的记录

时间:2015-12-06 07:40:09

标签: sql-server join

我有两个表tbl_data和tbl_events。

表tbl_data包含在站点中组织的各种事件。列将是SiteNo,EventName和EventDate。在站点中执行的每个事件都将与eventdate一起记录在此表中。

tbl_events表是一个查找表,其中包含站点中可能发生的所有事件。

某些网站可能会完成某些活动,而某些活动尚未完成。我想要网站待处理的事件列表。

我使用左外连接和左连接来组合tbl_data和tbl_events表但是我'只获取发生的事件列表。但是,我想找到网站的遗失或待处理的。

下面是我的sql代码:

SELECT DISTINCT SiteID
       ,le.eventname
       ,eventdate
    FROM lu_events AS le
    LEFT JOIN ( SELECT SiteID
                       ,e.eventname
                       ,d.eventdate
                    FROM tbl_data d
                    LEFT OUTER JOIN lu_events e ON d.eventname = e.eventname
               ) AS Grp ON Grp.eventname = le.eventname;

这是我对上述sql查询的输出

Output

但是我需要输出中所有丢失的行,以便我可以计算有多少事件待处理。

以下是我要求的输出。

enter image description here

我尝试了很多但无法获得上述输出。

这是我的db脚本。我在sql小提琴中遇到了一些问题。所以把它上传到我的onedrive。

Sql Script

1 个答案:

答案 0 :(得分:0)

  1. 创建一个表,其中包含tbl_data中每个siteId的一条记录。这是通过在siteID上分组来完成的。
  2. 将该表与包含所有事件(lu_events)的表交叉连接。然后,您将拥有一个包含siteId和eventName
  3. 的所有组合的结果表
  4. 使用左外连接将该表与tbl_data中的事件连接,这样您也将获得在tbl_data中没有记录的siteId和eventName的组合
  5. 试试这个:

    SELECT *
    FROM ( SELECT d.siteid
               ,e.EventName
            FROM ( SELECT e.siteid
                    FROM tbl_data e
                    GROUP BY e.SiteID
                 ) d
            CROSS JOIN lu_events e
         ) tab
    LEFT OUTER JOIN tbl_data d ON d.EventName = tab.EventName
                                  AND d.SiteID = tab.SiteID
    ORDER BY tab.SiteID
    

    阿尔伯特