使用另外两个不同表格中的信息过滤一个表

时间:2017-02-20 14:27:38

标签: sql postgresql

在一张桌子中,我每天都有不同商店组的开放和关闭时间。在另一张表中,我有不同的产品名称,以及销售它们的商店。在第三个表格中,我将全天所有产品的价格(包括商店关闭的时间段)保留多天。

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

更多细节我有以下三个表:

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

我在哪个方面犯了错误?

1 个答案:

答案 0 :(得分:0)

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