我试图编写一个查询,其中将报告日期范围内的任何重叠。
我能够通过多个查询和循环来完成这项工作,但我想知道是否可以通过一个查询来提高效率,表格会自动加入。
表结构是:
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)
所以给定相同的room_id,我希望能够查询具有相同room_id的任何其他预订是否在具有相同room_id的另一个预订的check_in和check_out之间(以避免双重预订)。
由于现有项目,我必须使用普通代码,而不是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
任何人都可以帮助优化查询以仅返回room_id相同的记录,并且存在重叠吗?
感谢您的帮助,
标记
答案 0 :(得分:4)
我认为你的问题是你自己越过每一行,这就是你的查询返回所有行的原因。确保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
答案 1 :(得分:0)
用r1.id&lt;&gt;杀死双行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