Oracle离开了联接没有按预期工作

时间:2013-11-04 21:33:18

标签: oracle left-join

我遇到左连接问题。我有两个表:客户和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

我原以为这会排除子查询中的所有客户,留下我需要的客户,但它什么都没有返回。 如果我只运行子查询,它会正确返回客户在该时间段内的数据。

我希望自己明确表示,如果需要添加某些内容,请告诉我。任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分: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;

输出:

NULL.
NOT v_bool is also NULL when v_bool is NULL.