2009-08-03 58 views
0

使用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 ids for the date wise

预期输出

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 

等等...,

需要查询帮助。

+0

Gopal你已经问过这样的问题:http://stackoverflow.com/questions/1220659/how-to-display-all-ids-for-the-selected-date – mlevit 2009-08-03 05:52:27

+0

@mlevit - 检查这个问题,这与那个不同。 – Gopal 2009-08-03 12:24:31

回答

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”的值将是有效日期。

希望这会有所帮助。

2

不问你的数据模型,为了得到你想要的结果,你将需要第三个表(我将调用日期)你需要表1和日期的交叉连接,这将给所有员工的结果天。然后你需要左连接到EmpID和日期。 左连接将包含来自第一个连接的所有结果,但仅填充来自表2的匹配行。 Access在处理查询结构方面很有趣,它也不支持SQL-92的语法,但它看起来如下所示。

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;