【问题标题】:Subquery question error "Too many arguments"子查询问题错误“参数太多”
【发布时间】:2021-03-27 12:25:55
【问题描述】:

我有一个问题。

为什么这段代码有效:

-- 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


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

【问题讨论】:

    标签: sql postgresql subquery


    【解决方案1】:

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

    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 值——如果返回值中有任何NULL,则根本不会返回任何行。一个安全的构造是NOT EXISTS

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多