使用给定值过滤 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
我已经搜索过但无法完全找到问题。我还尝试在我的数据库程序的查询生成器中执行多个查询,但结果不是我所期望的。所以这是我的问题。
假设我有两个 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