【问题标题】:Joining 3 Tables Inner & Left连接 3 个内部和左侧的表
【发布时间】:2016-04-09 19:41:25
【问题描述】:

有人可以验证我的查询是否产生了我希望的预期结果吗?

我正在使用 PostgreSQL。

 SELECT sold_at
, quantity
, returned_at
, name
, price
FROM sales
LEFT JOIN returns
ON sales.order_id=returns.order_id
JOIN  products
ON sales.product_id=products.product_id
WHERE name LIKE '%sock%'
ORDER by sold_at ASC
sold_at | quantity | returned_at | name | price

2015-06-01 | 8 | |socks-toeless | 15
2015-06-01 | 7 | 2015-06-08| socks-flat | 15

我的目标是输出包括从销售表购买的所有袜子(无论是否退回),并有一列显示袜子订单是否已退回,如果是,则填充日期已退回,如果该项目未退回,则为空白。

产品名称(即“袜子”)来自产品表。

【问题讨论】:

  • 您使用的是什么数据库?您可能只需将“LEFT JOIN”更改为“LEFT OUTER JOIN”。
  • 我正在使用 PostgreSQL
  • 那么 OUTER 是隐含的,所以我猜你的查询没问题。它没有像您期望的那样工作吗?
  • 您的查询似乎没问题...
  • 样本数据以及期望的结果会有所帮助。您的查询不太可能产生您想要的结果。

标签: sql postgresql join left-join inner-join


【解决方案1】:

是的,您的查询看起来应该按预期工作。

【讨论】:

  • 谢谢!在 Postgres 中,我如何仅从日期时间变量中选择日期?我在上面手动删除了它,但 DATETIME 实际上包括小时分钟秒。
  • 对“日期”的简单转换:stackoverflow.com/questions/6133107/… 根据您的需要,您还可以使用 PostgreSQL 函数,如“extract”或“date_trunc”。
【解决方案2】:

您的问题没有描述表格的外观。我希望returns 表包含产品,所以我希望查询看起来更像这样:

SELECT s.*, p.name,
       (case when r.product_id is null then 0 else 1 end) as IsReturnFlag
FROM sales s JOIN
     products p
     ON s.product_id = p.product_id LEFT JOIN
     returns r
     ON s.order_id = r.order_id AND
        s.product_id = r.product_id
WHERE p.name LIKE '%sock%';

【讨论】:

  • *销售表——sold_at、order_id、product_id、数量、user_id *产品表——product_id、名称、价格*退货表——returns_at、order_id
  • @am340 。 . .如果订单包含多个产品,您如何知道退回了什么产品?
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 2014-10-29
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
相关资源
最近更新 更多