2016-07-06 51 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应该只提供一行,取决于一系列关系和条件,但我不知道如何创建第一个关系,我会试图容纳你的代码 –