1

我遇到了左连接的问题。我有两个表:Customers 和 WeeklyShop 以及每个客户的每周摘要

我想选择在特定时间段内没有购买的所有客户。

我的代码

SELECT c.CUSTOMER_ID
FROM CUSTOMER c
    left join (
                SELECT distinct(w.CUSTOMER) as id
                FROM WEEKLYSHOP w
                WHERE w.WEEK_START >= beginDate
                    and w.WEEK_END <= endDate
              ) a
    on c.CUSTOMER_ID = a.id
WHERE a.id = null

我期望这会排除子查询中的所有客户,留下我需要的客户,但它什么也没返回。如果我只运行子查询,它会正确返回包含该期间数据的客户。

我希望我说清楚了,如果有什么需要补充的,请告诉我。任何帮助将不胜感激。

4

1 回答 1

2

您应该使用IS NULL而不是=运算符来检查是否未设置值:

SELECT c.CUSTOMER_ID
FROM CUSTOMER c
    left join (
                SELECT distinct(w.CUSTOMER) as id
                FROM WEEKLYSHOP w
                WHERE w.WEEK_START >= beginDate
                    and w.WEEK_END <= endDate
              ) a
    on c.CUSTOMER_ID = a.id
WHERE a.id IS null;

PL/SQL 上下文中的 NULL 示例:

DECLARE
 v_bool BOOLEAN;
BEGIN
  v_bool := 1 = NULL;

  IF NOT v_bool THEN -- same as IF v_bool = false THEN
    dbms_output.put_line('False.');
  ELSIF v_bool IS NULL THEN
    dbms_output.put_line('NULL.');
  END IF;

  IF (NOT v_bool) IS NULL THEN
    dbms_output.put_line('NOT v_bool is also NULL when v_bool is NULL.');
  END IF;
END;

输出:

无效的。
当 v_bool 为 NULL 时,NOT v_bool 也为 NULL。
于 2013-11-04T21:37:18.783 回答