当前位置:  开发笔记 > 数据库 > 正文

如果记录匹配另一个表中的条目(例如假日日期),则SQL查询排除记录

如何解决《如果记录匹配另一个表中的条目(例如假日日期),则SQL查询排除记录》经验,为你挑选了2个好方法。

我有两张桌子:

应用
程序applicationid(int)
applicationname(varchar)是
可用的(位)

假期
applicationid(int)
holidaydate(datetime)

我需要获取任何给定应用程序名称的isavailable标志,但它应该只返回如果该日不是假日.该isavailable标志是独立的节日-如果有系统范围内的问题,而不是按照设定的计划只能置.

我最初有类似的东西:

select top 1 apps.isavailable
from dbo.Applications apps, dbo.Holidays hol
where apps.applicationid = hol.applicationid and
      apps.applicationname = @appname and
      ((datediff(dd,getdate(),hol.holidaydate)) != 0)

但即使今天是假期,这也是回归记录,因为今天其他假日日期并不相同.

我试过了

and (CONVERT(VARCHAR,getdate(),101)) not in (CONVERT(VARCHAR,hol.holidaydate,101))

(它在SQL Server 2005上,所以没有Date类型所以我必须转换它)

但同样,即使今天是假期,它也会返回记录.如果今天不是假日,我如何使用"not in"或"except"子句(或其他)来构造此查询,以仅返回记录?

更新

我不需要没有假期的所有应用程序名称列表 - 我需要指定apps.applicationname的记录.以下答案仅返回今天没有假期的应用程序名称.如果查询不是假日,则查询应返回isavailable标志,否则如果是假日则不返回任何记录.我不关心其他应用程序.

另外,如果我添加一个表格如下:

HoursOfOperations
applicationid(int)
mondayopen(datetime)
mondayclose(datetime)
tuesdayopen(datetime)
tuesdayclose(datetime)
//打开和关闭一周的所有七天

我是否可以加入所有这三个表格,只有在特定日期的几小时内且不是假期时才返回记录?我是否必须在单独的查询中执行此操作?



1> Mitchel Sell..:

以下查询应该为您提供一个没有为CURRENT日期定义假期的应用程序列表.

SELECT apps.ApplicationName, apps.isavailable 
FROM dbo.Applications apps
WHERE apps.ApplicationName = @AppName
    AND NOT EXISTS 
( SELECT * 
  FROM Holidays 
  WHERE ApplicationId = apps.ApplicationId
     AND CONVERT(VARCHAR,getdate(),101) = CONVERT(VARCHAR,holidaydate,101)
)

基本上我们所做的就是选择没有匹配的所有东西.



2> Matt..:

好吧,只是为了与众不同,这样的事情怎么样:

select apps.isavailable
from dbo.Application apps left outer join dbo.Holidays hol
    on apps.applicationid = hol.applicationid
    and convert(varchar(10),getdate(),101) = convert(varchar(10),hol.holidaydate,101)
where apps.applicationname = @appname
    and hol.applicationid is null

基本上,您根据applicationid和当前日期加入表.由于它是左连接,因此您将始终获得与@appname匹配的所有应用程序,然后您只需根据假日日期作为当前日期筛选出任何匹配的结果.假设applicationname是唯一的,除非当前日期与假日匹配,否则您将始终获得单行,其中右半部分为空,在这种情况下,查询将不返回任何结果.

我不知道它如何与性能方面的其他解决方案叠加; 我认为连接通常比子查询更快,但这可能取决于各种因素,所以YMMV.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有