简单的INNER JOIN查询返回没有值 - 我哪里错了?

时间:2010-10-08 16:25:08

标签: sql sql-server sql-server-2005 tsql

下面的查询根据当前有效的招聘信息记录和工资记录获取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。

4 个答案:

答案 0 :(得分:5)

尝试注释掉一个联接,看看你是否得到任何结果,如果没有注释掉其他结果,等等,直到你开始看到结果。你注释掉的最后一个可能会给你一个关于它失败的原因的线索。

答案 1 :(得分:2)

如果没有实际的数据转储(以及create table语句),我们无法确切地说,因为我们无法看到您的数据。所以这里是如何处理这种情况,以便找出问题所在:

  1. 缩小SELECT语句以使其不具有JOIN - 您希望确保基表在继续之前返回所需的记录。
  2. 一次添加一个JOIN。您添加的每个JOIN,您需要检查结果集以查看您期望的行仍然可见。如果JOIN有多个条件(IE:ehf),那么再次 - 每次检查时逐步添加条件。
  3. 最终,导致问题的标准将变得明显,因此您必须检查如何处理这种情况。有可能不止一个JOIN导致麻烦,你可能在看到其他人之后才会看到其他人。

    我建议重构您的查询以使用您从FROM子句中选择最多数据的表。在这种情况下,这意味着:

    SELECT wt.wageTypeID
      FROM WAGETYPE wt
    

    这样可以更轻松地添加JOIN。

答案 2 :(得分:2)

查看实际的执行计划。鼠标悬停在箭头上。查看并查看从JOIN返回的行数变为零。

答案 3 :(得分:0)

一次重建Select SQL a join,从EmpHiringInfo和Salary开始,因为那些是你的where子句中引用的核心。