在一张桌子中,我每天都有不同商店组的开放和关闭时间。在另一张表中,我有不同的产品名称,以及销售它们的商店。在第三个表格中,我将全天所有产品的价格(包括商店关闭的时间段)保留多天。
只有当相应的商店每天营业时,我才需要一张包含产品价格和名称的表格。
更多细节我有以下三个表:
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')
我在哪个方面犯了错误?
答案 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'))