Sql查询相同表中的重叠日期
我正在尝试编写一个查询,其中将报告日期范围内的任何重叠 我可以通过几个查询和循环来实现这一点,但我想知道,如果只通过一个查询(表连接到自身),是否可以提高效率 表格结构为:Sql查询相同表中的重叠日期,sql,sql-server,Sql,Sql Server,我正在尝试编写一个查询,其中将报告日期范围内的任何重叠 我可以通过几个查询和循环来实现这一点,但我想知道,如果只通过一个查询(表连接到自身),是否可以提高效率 表格结构为: CREATE TABLE [dbo].[Rentals]( [ID] [int] IDENTITY(1,1) NOT NULL, [room_id] [int] NOT NULL, [check_in] [datetime] NOT NULL, [check_out] [datetime] NOT NULL, [custom
CREATE TABLE [dbo].[Rentals](
[ID] [int] IDENTITY(1,1) NOT NULL,
[room_id] [int] NOT NULL,
[check_in] [datetime] NOT NULL,
[check_out] [datetime] NOT NULL,
[customer_ref] [bigint] NULL)
因此,给定相同的房间id,我希望能够查询是否有任何具有相同房间id的其他预订在具有相同房间id的另一个预订的签入和签出之间(以避免重复预订)
由于现有的项目,我不得不使用普通代码,而不是LINQ
这是我目前掌握的,但它似乎正在返回所有记录:
SELECT r1.ID, r1.room_id, r1.check_in, r1.check_out,r1.customer_ref
FROM tblRental AS r1 INNER JOIN
tblRental AS r2 ON
r1.room_id = r2.room_id AND
r1.check_in < r2.check_out AND
r1.check_out > r2.check_in
选择r1.ID、r1.room\u ID、r1.check\u in、r1.check\u out、r1.customer\u ref
从tblRental到r1内部连接
TBL与r2接通时相同
r1.房间id=r2.房间id和
r1.签入r2.签入
是否有人可以帮助优化查询以仅返回房间id相同且存在重叠的记录
谢谢你的帮助
标记我认为您的问题在于您将每一行与其自身交叉,这就是您的查询返回所有行的原因。确保
r1.ID r2.ID
:
SELECT r1.ID, r1.room_id, r1.check_in, r1.check_out,r1.customer_ref
FROM tblRental AS r1 INNER JOIN
tblRental AS r2 ON
r1.room_id = r2.room_id AND
r1.check_in < r2.check_out AND
r1.check_out > r2.check_in AND
r1.ID <> r2.ID
选择r1.ID、r1.room\u ID、r1.check\u in、r1.check\u out、r1.customer\u ref
从tblRental到r1内部连接
TBL与r2接通时相同
r1.房间id=r2.房间id和
r1.签入r2.签入并
r1.ID r2.ID
我认为您的问题在于您将每一行与自身交叉,这就是为什么您的查询返回所有行。确保r1.ID r2.ID
:
SELECT r1.ID, r1.room_id, r1.check_in, r1.check_out,r1.customer_ref
FROM tblRental AS r1 INNER JOIN
tblRental AS r2 ON
r1.room_id = r2.room_id AND
r1.check_in < r2.check_out AND
r1.check_out > r2.check_in AND
r1.ID <> r2.ID
选择r1.ID、r1.room\u ID、r1.check\u in、r1.check\u out、r1.customer\u ref
从tblRental到r1内部连接
TBL与r2接通时相同
r1.房间id=r2.房间id和
r1.签入r2.签入并
r1.ID r2.ID
杀死r1.id为r2.id的两行。谓词也有一点逻辑错误。在两者之间使用分隔符,事情可能会更清楚一些
使用此查询时,可能需要输出r2
SELECT r2.ID, r2.room_id, r2.check_in, r2.check_out, r1.customer_ref
FROM tblRentals AS r1
INNER JOIN tblRentals AS r2 ON r1.room_id = r2.room_id
and r2.check_in between r1.check_in and r1.check_out
and r1.id <> r2.id
选择r2.ID、r2.room\u ID、r2.check\u in、r2.check\u out、r1.customer\u ref
从tblRentals作为r1
内部连接TBL构件,如r1上的r2。房间id=r2。房间id
和r2。在r1.签入和r1.签出之间签入
和r1.id r2.id
杀死r1.id为r2.id的两行。谓词也有一点逻辑错误。在两者之间使用分隔符,事情可能会更清楚一些
使用此查询时,可能需要输出r2
SELECT r2.ID, r2.room_id, r2.check_in, r2.check_out, r1.customer_ref
FROM tblRentals AS r1
INNER JOIN tblRentals AS r2 ON r1.room_id = r2.room_id
and r2.check_in between r1.check_in and r1.check_out
and r1.id <> r2.id
选择r2.ID、r2.room\u ID、r2.check\u in、r2.check\u out、r1.customer\u ref
从tblRentals作为r1
内部连接TBL构件,如r1上的r2。房间id=r2。房间id
和r2。在r1.签入和r1.签出之间签入
和r1.id r2.id
注意:操作员=代码>不是ISO标准。仅适用于Microsoft。请使用
。注意:操作员=代码>不是ISO标准。仅适用于Microsoft。请使用
。