对不起,如果这是一个愚蠢的问题,但我有这个特殊情况我无法理解如何处理。我需要一个查询,我在另一个表上得到两个日期值之间的所有日期值,现在这是我的查询
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是整数,这两个字段包含Hours表的外键,因此它们有时间值,hour_gkey(整数)是主键of Hours表,我只需要显示在与这两个字段对应的日期之间的hour_time(日期字段类型)的值。我怎么能这样做
立即使用SQL Server 2014
答案 0 :(得分:0)
这是我认为可以做到的一种方式。我不确定语法是否完全适合SQL Server。但基本的想法是,您需要从ServiceHours加入到小时以获取实际的开/关小时值,然后从小时中选择具有该范围值的行。
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中哪一行产生的行相关到。)
答案 1 :(得分:0)
我将您的问题解释为"如何选择Hours
的{{1}}值与hour_time
和ServiceHours.openhour_hour_gkey
之间的ServiceHours.closehour_hour_gkey
行的所有行{1}}"
我还假设您既没有从ServiceHours
中选择任何列,也没有过滤以将结果缩小到与单个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。