使用给定值过滤 FK

Filtering with given value AND on FK

我已经搜索过但无法完全找到问题。我还尝试在我的数据库程序的查询生成器中执行多个查询,但结果不是我所期望的。所以这是我的问题。

假设我有两个 table,hour_entries 和员工;

hour_entries里面有一个PK(obv.),employees有一个PK和一个FK(这个外键指的是table1的PK)。

假设 table hour_entries 中的列是 HourType(编程、清洁等)、描述和 TotalHours(5、2 等)。以及称为 EmployeeID 的 FK。

在另一个 table(employees) 中,您只有关于雇员的常规信息。名字、姓氏等..

当我执行这样的查询时

SELECT FirstName, LastName, JobType, Description FROM hour_entries
LEFT (OUTER) JOIN employees on employees.EmployeeID = hour_entries.EmployeeID WHERE UPPER(Description) LIKE UPPER('%Bla%') OR UPPER(HourType) LIKE UPPER('%Bla%') AND EmployeeID = 4;

这似乎给我返回的信息与描述和小时类型的检查相匹配。但它还有 returns 具有不同 EmployeeID 的行。

我想要具有给定 EmployeeID 的员工的信息。所以如果你把它放在 if 语句中,它看起来像这样。

if(EmployeeID == givenID && Description == "Bla" || HourType == "Bla")

如果描述不匹配,它还可以查看小时类型是否仍然匹配。如果 employeeID 不匹配,我不希望它 return 任何行。但它仍然如此。

您需要在 On 子句中保留所有加入条件。在 Where 子句中,它们有效地将 Left Join 转换为 Inner Join。在这种特殊情况下,它应该是 hour_entries.EmployeeID,而不是 Where 中的 employees.EmployeeID。你也错过了 OR:

周围的括号
SELECT FirstName, LastName, JobType, Description
FROM hour_entries
LEFT (OUTER) JOIN employees
    ON employees.EmployeeID = hour_entries.EmployeeID
WHERE hour_entries.EmployeeID = 4 --<- "FROM" table here, not "JOIN"
  AND (                           --<- Brackets around OR
          UPPER(Description) LIKE UPPER('%Bla%')
       OR UPPER(HourType) LIKE UPPER('%Bla%')
      );                          --<- Brackets around OR