[英]Make the correct INNER JOIN when using a BETWEEN
很抱歉,如果这是一个愚蠢的问题,但是我有这种特殊情况,我不知道如何处理。 我需要一个查询,让我得到另一个表上两个日期值之间的所有日期值,现在这是我的查询
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(integer)是Hours表的主键并且我只需要显示在对应于这两个字段的日期之间的hour_time(日期字段类型)的值。 我该怎么做
立即使用SQL Server 2014
我认为这是可以实现的一种方法。 我不确定语法是否完全适合SQL Server。 但是基本思想是,您需要从ServiceHours到Hours进行连接,以获取实际的打开/关闭小时值,然后从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中的每一行都与哪一行相关。)
我将您的问题解释为“我如何选择Hours
hour_time
值在与ServiceHours.openhour_hour_gkey
和ServiceHours.closehour_hour_gkey
相关的值之间的所有Hours
行?”
我进一步假设,您既无意从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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.