下面的查询根据当前有效的招聘信息记录和工资记录获取wageTypeID。
SELECT wt.wageTypeID
FROM TimeSheet t
INNER JOIN Employee e ON e.employeeID = t.employeeID
INNER JOIN Salary s ON s.salaryID = t.salaryID
INNER JOIN Wage w ON w.wageID = s.wageID
INNER JOIN EmpHiringInfo ehf ON ehf.EmpHiringInfoID = s.EmpHiringInfoID
INNER JOIN WageType wt ON wt.wageTypeID = w.wageTypeID
WHERE ehf.employeeID = 300
AND ehf.isActive = 1
AND s.isActive = 1
以上查询应返回值15!我想知道我哪里出错了?
以下是已连接表格的架构:
TimeSheet:
timeSheetID
employeeID - 300
salaryID
.
.
Salary:
salaryID
EmpHiringInfoID
wageID
isActive - true
.
.
WageType:
wageTypeID - 15
wageTypeTitle - Hourly
Wage:
wageID
wageTypeID - 15
wageAmount - $11
EmpHiringInfo:
EmpHiringInfoID
employeeID
isActive - true
.
.
工资中的isActive仅对一条记录为True。同样适用于 EmpHiringInfo。
答案 0 :(得分:5)
尝试注释掉一个联接,看看你是否得到任何结果,如果没有注释掉其他结果,等等,直到你开始看到结果。你注释掉的最后一个可能会给你一个关于它失败的原因的线索。
答案 1 :(得分:2)
如果没有实际的数据转储(以及create table语句),我们无法确切地说,因为我们无法看到您的数据。所以这里是如何处理这种情况,以便找出问题所在:
ehf
),那么再次 - 每次检查时逐步添加条件。最终,导致问题的标准将变得明显,因此您必须检查如何处理这种情况。有可能不止一个JOIN导致麻烦,你可能在看到其他人之后才会看到其他人。
我建议重构您的查询以使用您从FROM子句中选择最多数据的表。在这种情况下,这意味着:
SELECT wt.wageTypeID
FROM WAGETYPE wt
这样可以更轻松地添加JOIN。
答案 2 :(得分:2)
查看实际的执行计划。鼠标悬停在箭头上。查看并查看从JOIN返回的行数变为零。
答案 3 :(得分:0)
一次重建Select SQL a join,从EmpHiringInfo和Salary开始,因为那些是你的where子句中引用的核心。