如何编写从LEFT JOIN结果中减去INNER JOIN结果的SQL查询?

时间:2015-01-16 01:27:04

标签: sql left-join inner-join

以下是一个例子:我想看看我的营销工作对于我试图在商店销售的产品有多好。例如,我想知道有多少人在他们在2014年12月1日的电子邮件中收到我的产品后一个月内购买了我的产品,相比之下,有多少人在同一时间内购买了我的产品而没有收到优惠券。 以下是我的Customer表的示例:

CUSTOMER_NUMBER        PURCHASE_DATE
---------------        -------------
1                      2014-12-02
2                      2014-12-05 
3                      2014-12-05 
4                      2014-12-10 
5                      2014-12-21 

以下是我的电子邮件表格的示例

CUSTOMER_NUMBER        EMAIL_ADDR         SEND_DATE
---------------        ------------       ----------
1                      john@abc.com       2014-12-01
3                      mary@xyz.com       2014-12-01
5                      beth@def.com       2014-12-01

我非常清楚如何确定谁用优惠券购买产品:我在两张桌子上使用内部连接。但是为了确定谁买了这个产品,即使他们因为某种原因没有优惠券(他们没有电子邮件,他们是控制组的一部分等),我认为< / em>我需要使用左连接来获取结果集,然后从我的第一个结果集中减去内连接的结果。唉,这就是我被困住的地方。在上面的示例中,客户2和5购买了产品,即使他们从未收到优惠券,但我无法弄清楚如何编写查询来返回该数据。 我正在使用IBM的Netezza DB。谢谢!!

3 个答案:

答案 0 :(得分:5)

Left Outer JoinNULL检查

一起使用
SELECT C.*
FROM   customer C
       LEFT OUTER JOIN email e
                    ON C.customer_Number = E.Custmer_Number
WHERE  E.customer_Number IS NULL

或使用Not Exists

SELECT *
FROM   customer C
WHERE  NOT EXISTS (SELECT 1
                   FROM   email e
                   WHERE  c.customer_number = e.customer_number) 

答案 1 :(得分:0)

select from customers c left outer join email e
on c.customer_number = e.customer_number
    where e.customer_number is null
        or C.purchase_date < e.send_date

答案 2 :(得分:0)

SELECT
   C.*,
   PurchasedWithin30DaysOfEmailedCoupon =   
      CASE WHEN EXISTS (
         SELECT *
         FROM
            Email E
         WHERE
            C.CustomerID = E.CustomerID
            AND C.Purchase_Date <= E.Send_Date
            AND E.Send_Date < DateAdd(day, 30, C.Purchase_Date)
      ) THEN 1 ELSE 0 END
FROM
   Customer C
WHERE
   C.PurchaseDate IS NOT NULL
;

请原谅我不知道在DBMS中添加30天的正确语法 - 我确信这对您来说是一个简单的修复。

然后,您只需按PurchasedWithin30DaysOfEmailedCoupon值进行分组即可计算。