如何显示非匹配值?

时间:2009-08-03 05:18:45

标签: ms-access

使用VB6和MS-ACCESS 2003

所以......,

表1

EMPID DATE     

101 22-07-2009 
201 22-07-2009 
501 22-07-2009  
301 23-07-2009
401 23-07-2009
501 23-07-2009
101 24-07-2009
501 24-07-2009

所以......,

从上表中我想显示两个表,以显示日期明确的所有EMP ID

预期产出

EMPID  DATE

101 22-07-2009
201 22-07-2009
301 
401 
501 22-07-2009
101
201
301 23-07-2009
401 23-07-2009
501 23-07-2009
101 24-07-2009
201
301
401
501 24-07-2009

所以......,

需要查询帮助。

2 个答案:

答案 0 :(得分:2)

在不询问您的数据模型的情况下,要获得您想要的结果,您将需要第三个表格(我将称之为日期)您需要表1和日期的交叉加入,这将给出所有员工的所有日子的结果。然后你需要左加入到EmpID和日期。 左连接将包括第一次连接的所有结果,但仅填充表2中的匹配行。 Access如何处理查询结构很有趣,它也不支持SQL-92 CROSS JOIN语法,但它看起来如下所示。

SELECT t1.EmpID, t2.Date 
  FROM (
        SELECT t1.EmpID, d.Date 
          FROM [Table 1] AS t1, 
               Dates AS d
       ) AS DT1
       LEFT OUTER JOIN [Table 2] AS t2 
          ON DT1.EmpID = t2.EmpID 
             AND DT1.Date = t2.Date
 ORDER 
    BY DT1.Date, DT1.EmpID;

答案 1 :(得分:2)

没有执行以确认无误,但这应该可以帮助你完成任务:

SELECT
    AllPossibleCardEvents.PersonId, 
    AllPossibleCardEvents.EmpName,
    AllPossibleCardEvents.TitleCode,
    AllPossibleCardEvents.TitleName,
    AllPossibleCardEvents.CardEventDate, 
    ActualCardEvents.CardEventDate AS MatchingCardEventDate
FROM
    (
        (
            SELECT
                p.PersonId, 
                p.EmpName,
                p.TitleCode,
                p.TitleName,
                AllDates.CardEventDate
            FROM
                (SELECT DISTINCT CardEventDate FROM T_Cardevent) AllDates, 
                T_Person p
        ) AllPossibleCardEvents
        LEFT OUTER JOIN T_Cardevent ActualCardEvents ON 
            AllPossibleCardEvents.PersonId = Actual.PersonId AND 
            AllPossibleCardEvents.CardEventDate = Actual.CardEventDate
    )

对于非实际事件的记录,“MatchingCardEventDate”将为NULL。对于实际事件,“MatchingCardEventDate”的值将是有效日期。

希望这有帮助。