首先:抱歉,查询中的关键字是德语。我将提供每个关键字的解释,以便您轻松了解该问题。
我的数据库由4个表组成:
mitarbeiter (MA_ID,姓名......) 包含员工数据。相关的是ID和名称(分隔的名字和姓氏)
stunden_auftrag (MA_ID,gesamt ...) 包含员工必须为项目工作的工作时间。由employee-id标识。对于此查询,仅总量(gesamt)很重要
stunden_geleistet (MA_ID,gesamt ...) 和已经工作的时间一样。
auftrag (MA_ID,von,bis ......) 包含订单运行多长时间。 (von表示startdate,bis表示enddate)
以下查询的目的是向我展示在接下来的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';`
此查询为我提供了所需的Resultset。现在我想为查询添加另一个要求。它不仅应该显示订单即将终止的员工,还应该只显示只有不到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';`
我知道此查询尚未过滤此要求,因为我已经使用此查询获得了一个空结果集。只添加联接使得Resultset为空,尽管肯定有至少一个虚拟员工满足要显示的所有要求。
示例数据:
表“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结构也是正确的。你知道错误是什么吗?
提前致谢!
祝你好运, joermunG
答案 0 :(得分:0)
您可以尝试此查询:
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
where DATEDIFF(auftrag.bis, CURRENT_TIMESTAMP) between -31 and 31