【问题标题】:Filtering one Table with information in another two different tables用另外两个不同表中的信息过滤一个表
【发布时间】:2017-02-20 22:53:42
【问题描述】:

在一张表中,我列出了每天不同商店组的营业和关闭时间。在另一个表中,我有不同的产品名称以及它们在哪些商店出售。在第三张表中,我有很多天(包括商店关闭期间)所有产品的价格。

仅当相应商店每天营业时,我才需要一张包含产品价格和名称的表格。

更详细地说,我有以下三个表:

Master,包含列:name、code、group_name。

StatusChange,列:日期、时间、组名、状态。

价格,列:日期、时间、代码、价格。

StatusChange.status 列有每个组和每个天的开或关状态(一个组的一个商店在不同的日子在不同的时间打开和关闭,不同组的商店在不同的时间打开和关闭)天)。

我知道在某些时候我必须使用一些 INNER JOIN,但我不知道如何用三个表写下来。

我首先从以下联接开始:

(SELECT m.*,s.time, s.date FROM Master AS m
INNER JOIN StatusChange AS s ON m.group_name = s.group_name 
WHERE s.status = 'Open' OR s.status = 'close') AS X

这给了我一个包含 group_name、代码、日期和时间的表格。从这里我应该能够再次简单地进行 INNER JOIN 并完成。但是语法究竟是如何工作的呢?

我尝试了以下方法,但结果为空:

SELECT p.* FROM Price AS p
INNER JOIN 
(SELECT m.*,s.time, s.date, s.status FROM Master AS m
INNER JOIN StatusChange AS s ON m.group_name = s.group_name 
WHERE s.status = 'Open' OR s.status = 'close') AS X
ON X.date = p.date AND X.code = p.code
WHERE (X.time < p.time AND X.statis = 'Open')
OR  (X.time > p.time AND X.statis = 'Close')

有什么建议我在哪一部分犯了错误?

【问题讨论】:

  • 很多名词的意思不太清楚:statuschange是什么意思? price 是什么意思?什么意思*每天开放?也许一个例子可以说明这一点。
  • 您需要编写一个子查询,为您提供 group_name、open_time 和 close_time。
  • 类似这样的东西:stackoverflow.com/questions/15161262/merge-adjacent-rows-in-sql 你有一个,假设它是名称“t”,你可以在 group_name 上进行 INNER JOIN t。然后你可以为打开/关闭时间的每个部分说 WHERE (p.time >= t.open AND p.time
  • 由于人们很难在没有示例的情况下处理查询,如果您发布了一些允许其他人创建您的场景的 CREATE TABLE 语句和 INSERT 语句,您可能会得到更多的响应。这就像为 SQL 问题创建一个MVCE

标签: sql postgresql


【解决方案1】:
WITH sub as (
  SELECT 
    m.name, m.code, m.group_name, s.time, s.date, s.status 
  FROM 
    Master m, StatusChange s
  WHERE
    m.group_name = s.group_name 
    AND (s.status = 'Open' OR s.status = 'close'))

SELECT 
  p.date, p.time, p.code, p.price, x.name, x.group_name, x.status 
FROM 
  Price p, sub x
WHERE
  sub.date = p.date 
  AND sub.code = p.code
  AND ((x.time < p.time AND x.status = 'Open') OR (x.time > p.time AND x.status = 'Close'))

【讨论】:

  • 我认为这只适用于只有一个打开时间和一个关闭时间的情况。如果商店今天 20:00 关门,明天 9:00 开门,那么今天 21:00 的价格仍然与您的查询相符,因为它比明天 9:00 还小。但它不应该。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多