0

我只是想就我正在开发的这个设备库存和预订系统寻求帮助......

所以...我有 3 张桌子。tbl_items, tbl_bulk_items, 和tbl_reservations.

tbl_items包含所有项目(按 UNIT 分类的设备)

tbl_items_bulk包含所有批量的项目。例如一套烹饪刀(12 件/套)

tbl_reservations包含所有预订信息

到目前为止,这是我获取tbl_itemstbl_items_bulk表中所有项目的查询。

SELECT bcode
FROM

/*gets all the items in the inventory*/
(SELECT bcode FROM tbl_items AS T1
UNION
SELECT bcode FROM tbl_items_bulk) AS T2

我会根据另一个查询对其进行查询,以获取 tbl_reservation 中不存在的所有 bcode 的列表(意味着它可用)...

/*gets all the items in the inventory that satisfies the given conditions*/
WHERE bcode
NOT IN
(SELECT bcode FROM tbl_test)

但问题是,我需要使用条件(不太清楚如何正确地做到这一点)来进一步过滤查询以获取所有“可用”项目。

这里的条件...

如果项目的 bcode 在预订表中,则它不可用。或者如果它(项目 bcode)在预订表中,但预订的日期和时间与用户声明的不同,那么它仍然可以算作可用。

例如,设备 1 于 2013 年 9 月 16 日上午 7:30 至上午 10:30 保留。如果用户询问它是否可用于另一个日期(例如 2013-09-17),从上午 7:30 到晚上 10:30,它应该显示为“可用”。(我希望我说得更清楚)

关于如何在某个日期和时间获得所有“可用”设备的任何想法?

我当前的代码:

SELECT bcode
FROM
/*gets all the items in the inventory*/
(SELECT bcode FROM tbl_items AS T1
UNION
SELECT bcode FROM tbl_items_bulk) AS T2
/*gets all the items in the inventory that satisfies the given conditions*/
WHERE bcode
NOT IN
(SELECT bcode FROM tbl_test WHERE resDate!='2013-09-16')

2013 年 9 月 17 日更新:

最新代码:

SELECT b.*
FROM (SELECT * FROM tbl_items
      UNION
      SELECT * FROM tbl_items_bulk
     ) b left outer join
     tbl_test t
     on b.bcode = t.bcode and
     NOT ('4:30' < t.timeSTART OR '7:00' > t.timeEND)
WHERE t.bcode is null;
4

2 回答 2

1

听起来您正在查看bcode某个时间是否有任何预订。我认为以下查询具有正确的逻辑:

SELECT b.bcode
FROM (SELECT bcode FROM tbl_items
      UNION
      SELECT bcode FROM tbl_items_bulk
     ) b left outer join
     tbl_reservation r
     on b.bcode = r.bcode and
        @USERTO <= r.ToDate and
        @USERFROM >= r.FromDate
WHERE r.bcode is null;

这样做是检查是否有任何与bcode给定日期匹配的预订left outer join。请注意日期条件在on子句中。因此,如果存在匹配,则将返回一行。如果没有匹配,则bcode保留表中的值将是NULL-- 这是where子句过滤的内容。

于 2013-09-16T14:35:17.113 回答
0

我无法添加评论,但要回答您关于 r.bcode 为 null 正在做什么的问题。

左外连接意味着给我来自左表的所有行(在这种情况下是联合的结果),以及来自右侧的所有匹配行(table_reservation)。如果联合结果集中的一行在 table_reservation 中没有匹配项,则 bcode 将返回为 null。因此,过滤该列上的空值将返回 table_reservation 中没有匹配的所有行。

于 2013-09-16T15:41:56.437 回答