子查询问题错误 "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 *
。只需明确列出列,这样代码应该做什么就很清楚了。
我有一个问题。
此代码有效的原因:
-- 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 *
。只需明确列出列,这样代码应该做什么就很清楚了。