子查询问题错误 "Too many arguments"

Subquery question error "Too many arguments"

我有一个问题。

此代码有效的原因:

-- users's first purchase day 
WITH befor_campaign AS (
    SELECT user_id, 
           MIN(created_at) AS first_day_of_purchase
    FROM marketing_campaign
    GROUP BY user_id ) 
    
-- Find users purchased products on the first day:
    ,user_w_first_day_purchase_after_mkt_work AS
    (SELECT 
        user_id, product_id
    FROM marketing_campaign
    WHERE (user_id, created_at) IN (SELECT * FROM befor_campaign)
    )

-- Pull all users who meet requirments   
    ,data_set AS (
    SELECT * 
    FROM marketing_campaign
    WHERE (user_id, created_at) NOT IN (SELECT * FROM befor_campaign)
    AND (user_id, product_id) NOT IN (SELECT * FROM user_w_first_day_purchase)
    )

SELECT count(distinct user_id) FROM data_set

但这不起作用并给我错误“参数太多”?

    WITH Before_MKT as
    (
     SELECT user_id, product_id,
       Min(created_at)
     FROM marketing_campaign
     Group By user_id, product_id
     Order by user_id
     )
 
    ,data_set AS (
    SELECT user_id 
    FROM marketing_campaign
    where (user_id) NOT IN (SELECT * FROM Before_MKT)
    )

SELECT count(distinct user_id) FROM data_set


我正在尝试优化我的查询,将两个步骤合二为一,但它不起作用,我不明白为什么。有人可以帮助我吗? 非常感谢!

此上下文中的 * 扩展到所有列。所以这段代码:

WHERE (user_id, created_at) IN (SELECT * FROM befor_campaign)

真的是:

WHERE (user_id, created_at) IN (SELECT user_id, first_day_of_purchase FROM befor_campaign)

将具有两个元素的元组与具有两个元素的元组进行比较。没问题。

然而,这段代码:

where (user_id) NOT IN (SELECT * FROM Before_MKT)

展开为:

where (user_id) NOT IN (SELECT user_id, product_id, "MIN(created_at)" FROM Before_MKT)

左边一列,右边三列。不行。你得到一个错误。

我强烈建议您不要将 NOT IN 用于子查询。它不会直观地处理 NULL 值——如果 any 的返回值是 NULL,则根本不会返回任何行。一个安全的结构是 NOT EXISTS.

我也不鼓励您在此类查询中使用 SELECT *。只需明确列出列,这样代码应该做什么就很清楚了。