2016-07-06 23 views
0

我很抱歉,如果這是一個愚蠢的問題的時候,但我有我想不出如何處理這種特殊情況。我需要一個查詢在那裏我得到另一個表兩個日期值之間的所有日期值,而現在這是我的查詢進行正確的INNER JOIN使用之間

SELECT  h.hour_gkey, h.hour_time 
FROM  Hours as h 
INNER JOIN ServiceHours sh ON h.hour_gkey BETWEEN sh.openhour_hour_gkey AND sh.closehour_hour_gkey; 

所以要有點進一步解釋,該ServiceHours表有兩個字段openhour_hour_gkey和closehour_hourg_key那是整數,這兩個字段包含小時表的外鍵,因此它們有時間值,hour_gkey(整數)是小時表的主鍵,我只需要顯示小時表中的hour_time(日期字段類型)值與這兩個領域相對應的日期。我怎麼能這樣做

立即使用SQL Server 2014

+0

知道您正在使用哪個數據庫系統可能會有幫助。 –

+0

@DaveCosta編輯問題 –

+0

你說一方面'openhour_hour_gkey'和'closehour_hour_gkey'是整數,另一方面它們包含時間值。這是什麼?我假設它們包含整數小時數(不是時間值),但如果它們確實包含時間,那麼這可能是問題的一部分。 –

回答

0

我解釋你的問題是「如何選擇所有的Hourshour_time值是那些與ServiceHours.openhour_hour_gkeyServiceHours.closehour_hour_gkey之間的行嗎?」

我進一步假設,您既沒有從ServiceHours中選擇任何列也沒有進行篩選以將結果縮小到與單個行相關的結果。因此,如果有多個ServiceHour行,你會得到一組Hours排爲每一個,這些套不一定是不相交,並與沒有指示與ServiceHour去。

在任何情況下,你需要執行加入您要遍歷每個關係,爲這個查詢,你似乎想另一個加盟,以獲得目標數據。這可能是這樣的:

SELECT h.hour_gkey, h.hour_time 
FROM   
    Hours h 
    CROSS JOIN ServiceHours sh 
    INNER JOIN Hours sho 
    ON sh.openhour_hour_gkey = sho.hour_gkey 
    INNER JOIN Hours shc 
    ON sh.closehour_hour_gkey = shc.hour_gkey 
WHERE h.hour_time BETWEEN sho.hour_time AND shc.hour_time; 

我已經寫了BETWEEN條件的過濾謂詞,而不是連接謂詞,因爲這似乎是一個更好的表徵。然而,對於內部連接,這兩個選擇是等同的。還要注意,這個查詢在語義上等同於@DaveCosta's。

+0

我試圖運行這個,但給我錯誤,因爲在第一個內部連接沒有ON條件,爲什麼會發生這種情況 –

+0

@Forcefield,顯然是因爲SQL Server要求你說「CROSS JOIN」不提供「ON」謂詞。我以爲ANSI標準允許'INNER JOIN'沒有'ON',但似乎並非如此,儘管一些DBMS允許它作爲擴展。我已經更新了我的答案。 –

+0

出於某種原因,這給出了一組重複的結果 –

0

這是我認爲可以做到的一種方法。如果SQL Server的語法完全正確,我不確定。但基本思路是,您需要從ServiceHours加入Hours以獲取實際的開/關小時值,然後從小時數中選擇具有該範圍值的行。

WITH min_max AS (
    SELECT h1.hour_time min_hour_time, h2.hour_time max_hour_time 
    FROM ServiceHours sh 
    JOIN Hours h1 ON h1.hour_gkey = sh.openhour_hour_gkey 
    JOIN Hours h2 ON h2.hour_gkey = sh.closehour_hour_gkey 
) 
SELECT h.hour_time 
    FROM Hours h 
    JOIN min_max ON h.hour_time BETWEEN min_max.min_hour_time AND min_max.max_hour_time 

(注意:我假設ServiceHours僅有一行。如果沒有,有可能是你想在子查詢和主查詢既包括指示其他一些領域中的哪一行ServiceHours每個結果行涉及。)

+0

ServiceHours應該只提供一行,取決於一系列關係和條件,但我不知道如何創建第一個關係,我會試圖容納你的代碼 –