-1

我认为 OP 删除了这个问题,措辞和措辞都很差,我认为这是一种耻辱;它提供了一个机会来演示在 SQL 中使用UNION操作来动态构建有效执行操作所需的关系:
原始帖子来自(如果下面的 OP 评论请求它,我将注明来源):

我有两个名为 tblBooking 的表和 tblRoom
tblBooking 有一个 ID,Day,RoomID;
tblRoom 有一个 ID,描述

我需要创建一个查询,显示哪些房间在某些日子没有使用,即 1、2、3、4、5、6、7

我如何使用联合查询来做到这一点?我已经尝试了所有不同的组合,但无法得到任何工作,请帮助

4

3 回答 3

2

试试这个,用一个联合来创建日历表Days

select Day, Room ID
from (
  select Day=1 union select Day=2 union select Day=3 union select Day=4 union
  select Day=5 union select Day=6 union select Day=7
) Days
cross join tblRoom

except

select Day, RoomID from tblBooking

order by RoomID, Day
于 2013-05-03T03:21:59.023 回答
2

在 SQL Server 2008+ 中,您还可以使用表值构造函数:

SELECT Day, RoomID
FROM (VALUES (1),(2),(3),(4),(5),(6),(7)) as Days(Day) 
CROSS JOIN tblRoom
EXCEPT
SELECT Day, RoomID FROM tblBooking
ORDER BY RoomID, Day

http://www.sql-server-helper.com/sql-server-2008/row-value-constructor-as-derived-table.aspx http://msdn.microsoft.com/en-us/library/dd776382 .aspx

于 2013-05-03T04:27:25.360 回答
1

这是另一种不使用的方法UNION

WITH NumberSequence
AS
(
    SELECT 1 Number
    UNION ALL
    SELECT Number + 1 FROM NumberSequence WHERE Number < 7
)
SELECT  a.*, b.*
FROM    NumberSequence a
        CROSS JOIN (SELECT DISTINCT RoomID FROM TableName) b
        LEFT JOIN TableName c
          ON c.Day = a.Number AND c.RoomID = b.RoomID
WHERE   c.RoomID IS NULL
ORDER   BY a.Number, c.RoomID, c.Day
OPTION (MaxRecursion 1000)
于 2013-05-03T03:31:44.257 回答