外部联接与条件

时间:2013-01-13 03:14:14

标签: sql database ms-access database-design

我试图获取所有可用的密钥,意味着已经返回的密钥(return_date不为空),密钥没有丢失(lost_key = false),并且之前从未租用过密钥(id为null)。但是当我运行这个时,我得到了0个记录。如果我删除了id条件,我只获得之前已经租用的密钥,并且忽略了不在keyActivity表中的所有密钥。有谁知道我做错了什么?

SELECT a.key_id, a.drawer_num
FROM 
    keys AS a 
    left outer JOIN keyActivity AS b 
        ON a.key_id = b.key_id
WHERE 
    return_date is not null 
    and lost_key =false
    and id is null;

enter image description here

使用的解决方案:

SELECT a.key_id, a.drawer_num
FROM keys AS a LEFT JOIN keyActivity AS b ON a.key_id = b.key_id
WHERE (b.return_date is not null 
and b.lost_key =false) 
OR b.id is null;

1 个答案:

答案 0 :(得分:1)

id可能是两个表中的字段,如果是这样,那么您的条件id is null将被错误地解释为id的{​​{1}}为{{ 1}},从而导致结果集为空。

如果您使用其全名(即keys)进行调用,它应该有效,因为您要排除之前的任何NULL

但是,我也相信您希望以前的条件由b.id和括号连接,然后由keyActivity连接的最后一个条件,因为以前的关键活动是正常的,只要密钥有已经归还了。

AND

编辑:我重新安排了这些条件,同时也解决了职员在丢失密钥之前丢失密钥的情况。