【发布时间】: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