2017-02-20 45 views
0

在一張表格中,我有每天不同組別店鋪的開門和關門時間。在另一張表中,我有不同的產品名稱和銷售的商店。在第三張表中,我有多天所有產品的價格(包括店鋪關閉期間)。在另外兩個不同的表格中過濾信息

只有當相應的商店每天都營業時,我需要一個包含產品價格和名稱的表格。

在更多的細節,我有以下三個表:

碩士學位,列:名稱,代碼,組名。

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 

這給了我與組名,代碼,日期和時間的表。從這裏我應該可以簡單地再一次加入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

許多術語的含義很不明確:「statuschange」的含義是什麼? 「價格」的含義是什麼?什麼意思*每天開放?也許一個例子會揭示這一點。 –

+0

您需要編寫一個子查詢,爲您提供group_name,open_time和close_time。 –

+0

這樣的事情:http://stackoverflow.com/questions/15161262/merge-adjacent-rows-in-sql 你有一個,假設它是名字「t」,你可以INNER JOIN t ON group_name。然後你可以對開放/關閉時間的每個部分說出WHERE(p.time> = t.open AND p.time

回答

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

我認爲這隻適用於只有一個開放時間和一個關閉時間的情況。如果商店在今天20:00關門,明天9:00開門,那麼今天21:00的價格仍然會與您的查詢相匹配,因爲它明天不到9:00。但它不應該。 –

相關問題