Sql 使用另两个不同表中的信息筛选一个表

Sql 使用另两个不同表中的信息筛选一个表,sql,postgresql,Sql,Postgresql,在一张表中,我列出了不同类别商店每天的开门和关门时间。在另一个表中,我有不同的产品名称以及它们在哪个商店销售。在第三个表中,我列出了全天所有产品的价格,包括商店关门很多天的时间 我需要一个表,只有当相应的商店每天营业时,才列出产品的价格和名称 更详细地说,我有以下三个表: Master,包含以下列:名称、代码、组名称 StatusChange,包含以下列:日期、时间、组名称、状态 价格,包含以下列:日期、时间、代码、价格 StatusChange.status列的状态为每个组的打开或关闭状态,对

在一张表中,我列出了不同类别商店每天的开门和关门时间。在另一个表中,我有不同的产品名称以及它们在哪个商店销售。在第三个表中,我列出了全天所有产品的价格,包括商店关门很多天的时间

我需要一个表,只有当相应的商店每天营业时,才列出产品的价格和名称

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

Master,包含以下列:名称、代码、组名称

StatusChange,包含以下列:日期、时间、组名称、状态

价格,包含以下列:日期、时间、代码、价格

StatusChange.status列的状态为每个组的打开或关闭状态,对于每一天,一个组的商店在不同的日期在不同的时间打开和关闭,不同组的商店在一天中的不同时间打开和关闭

我知道我必须在某个时候使用一些内部连接,但我不知道如何用三个表来记录它

我首先从以下连接开始:

(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
这给了我一个包含组名、代码、日期和时间的表。从这里,我应该能够简单地再次进行内部连接并完成。但是语法究竟是如何工作的呢

我尝试了以下操作,但结果为空:

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')

我在哪一部分犯了错误?

很多术语的含义都不清楚:状态变化的含义是什么?价格是什么意思?什么是每天开放?也许一个例子可以说明这一点。您需要编写一个子查询,提供组名称、打开时间和关闭时间。类似于这样:如果您有一个,假设它是名称t,您可以在组名称上内部联接t。然后,您可以为打开/关闭时间的每个部分指定p.time>=t.open和p.timeWITH 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'))