【发布时间】:2015-01-19 12:45:26
【问题描述】:
首先:很抱歉查询中的关键字是德语。我将对每个关键字进行解释,以便您轻松理解问题。
我的数据库包含 4 个表:
mitarbeiter(MA_ID、姓名……) 包含员工数据。相关的是 ID 和姓名(名字和姓氏分开)
stunden_auftrag(MA_ID, gesamt…) 包含员工必须为项目工作的工作时间。由员工 ID 标识。对于这个查询,只有总量(gesamt)很重要
stunden_geleistet(MA_ID, gesamt…) 和以前一样,已经工作了。
auftrag(MA_ID、von、bis…) 包含订单运行时间的日期。 (von 表示开始日期,bis 表示结束日期)
以下查询的目的是向我显示订单在未来 31 天内终止的所有员工。
我想出的查询是这样的:
`SELECT mitarbeiter.MA_ID,
mitarbeiter.nachname,
mitarbeiter.vorname,
auftrag.von,
auftrag.bis,
DATEDIFF(auftrag.bis, CURRENT_TIMESTAMP) AS Resttage
FROM mitarbeiter
INNER JOIN auftrag ON mitarbeiter.MA_ID = auftrag.MA_ID
HAVING Resttage >= '0' AND Resttage <= '31';`
这个查询给了我想要的结果集。现在我想向查询添加另一个要求。它不仅应显示订单将要终止的员工,还应显示仅剩不到 10% 的已订购工作时间的员工。 (比如“hoursbooked - hoursworked <= hoursbooked*0.1”)
为此,我必须为包含工作时间的两个表添加连接:
`SELECT mitarbeiter.MA_ID,
mitarbeiter.nachname,
mitarbeiter.vorname,
auftrag.von,
auftrag.bis,
DATEDIFF(auftrag.bis, CURRENT_TIMESTAMP) AS Resttage,
FROM mitarbeiter
INNER JOIN auftrag ON mitarbeiter.MA_ID = auftrag.MA_ID
INNER JOIN stunden_geleistet ON auftrag.MA_ID = stunden_geleistet.MA_ID
INNER JOIN stunden_auftrag ON stunden_geleistet.MA_ID = stunden_auftrag.MA_ID
HAVING Resttage >= '-31' AND Resttage <= '31';`
我知道此查询尚未过滤此要求,因为我已经使用此查询获得了一个空结果集。仅添加联接会使结果集为空,尽管肯定有至少一个虚拟员工满足所有显示要求。
样本数据:
表“mitarbeiter”
MA_ID nachname vorname
1 Simpson Homer
表“auftrag”
MA_ID von bis
1 2014-01-01 2015-01-31
表“stunden_gebucht”
MA_ID gesamt
1 1200
表“stunden_geleistet”
MA_ID gesamt
1 1100
据我了解,由于满足查询条件,应该显示该员工。但是 ResultSet 是空的。我没有收到任何语法错误,而且我认为我的 Join 结构也是正确的。你知道错误是什么吗?
提前致谢!
最好的问候, 乔尔蒙
【问题讨论】: