首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带条件的连接表

问带条件的连接表
EN

Stack Overflow用户
提问于 2012-01-02 18:53:06
回答 3查看 75关注 0票数 2

我有一个表连接的问题。

我有两个表: product_commons和product_prices。Product_prices有标准产品价格+活动预生成价格(campaign_id)的记录。我需要一个查询,它返回我的产品列表与活动价格(如果存在)或标准价格(如果没有)。

如下所示:

代码语言:javascript
复制
SELECT * FROM product_commons 
   INNER JOIN product_prices ON product_commons.id = product_prices.product_id 
WHERE (campaign_id = 3 OR campaign_id IS NULL) 
GROUP BY product_commons.id

不幸的是,这个查询只返回campaign_id = NULL的价格。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-02 18:56:35

您需要结合使用内部联接和左(外)联接,并在联接条件中使用campaign_id筛选器。要将不同行中的2个价格放入一行,您需要2个JOIN。

代码语言:javascript
复制
SELECT
   *,
   COALESEC(pstd.price, pc.price)
FROM 
   product_commons pc
   JOIN
   product_prices pstd ON pc.id = pstd.product_id AND pstd.campaign_id IS NULL;
   LEFT JOIN 
   product_prices pp ON pc.id = pp.product_id AND pp.campaign_id = 3;

您也不需要GROUP BY :它在标准SQL或其他RDBMS中没有意义(并且会产生如下所示的错误

票数 2
EN

Stack Overflow用户

发布于 2012-01-02 19:03:01

由于您要为活动价格和默认价格查找不同的价格行,因此需要两个连接:一个用于默认价格(内部,因为默认值始终存在),另一个用于活动#3价格(外部,因为它可能不存在)。如果不为空,则COALESCE返回第一个操作数;否则,返回第二个操作数。

代码语言:javascript
复制
SELECT *,COALESCE(c3_price.price,def_price.price)
FROM product_commons
LEFT OUTER JOIN product_prices c3_price ON product_commons.id = c3_price.product_id and c3_price.campaign_id = 3
INNER JOIN product_prices def_price ON product_commons.id = def_price.product_id and def_price.campaign_id IS NULL
票数 1
EN

Stack Overflow用户

发布于 2012-01-02 19:02:24

使用左连接

代码语言:javascript
复制
Select *  FROM product_commons LEFT JOIN product_prices ON product_commons.id = product_prices.product_id  WHERE (campaign_id = 3 OR campaign_id IS NULL) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8699974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档