2

我试图获取所有可用的密钥,这意味着已经返回的密钥(return_date 不为空),密钥没有丢失(lost_key = false),并且之前从未租用过密钥(id 为空)。但是,当我运行它时,我得到 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;

在此处输入图像描述

使用的解决方案:

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;
4

1 回答 1

1

id可能是两个表中的一个字段,如果是这样,您的条件id is null将被错误地解释为idto keysbe NULL,从而导致一个空的结果集。

如果你用它的全名来称呼它,它应该可以工作,即b.id因为你想排除任何以前keyActivity的 .

但是,我也相信您希望将前面的条件用 和 连接起来,AND然后用括号连接最后一个条件,OR因为只要返回了密钥,以前的密钥活动就可以了。

SELECT * FROM keys AS a LEFT OUTER JOIN keyActivity AS b ON a.key_id = b.key_id
  WHERE (b.return_date IS NOT NULL OR b.id IS NULL) AND a.lost_key = false;

编辑:我重新安排了条件,以捕捉店员在分发钥匙之前丢失钥匙的情况。

于 2013-01-13T03:21:01.083 回答