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

前端之家收集整理的这篇文章主要介绍了SQL查询如果匹配另一个表中的条目(例如假日日期),则排除记录前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两张桌子:

Application
applicationid (int)
applicationname (varchar)
isavailable (bit)

Holidays
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,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)
//open and close for all seven days of the week

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

解决方法

以下查询应该为您提供一个没有为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,101) = CONVERT(VARCHAR,holidaydate,101)
)

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

猜你在找的MsSQL相关文章