我遇到左连接问题。我有两个表:客户和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
我原以为这会排除子查询中的所有客户,留下我需要的客户,但它什么都没有返回。 如果我只运行子查询,它会正确返回客户在该时间段内的数据。
我希望自己明确表示,如果需要添加某些内容,请告诉我。任何帮助将受到高度赞赏。
答案 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.