2016-02-23 2 views
0

Я искал, но не мог полностью задать вопрос. Я также пытался выполнить несколько запросов в моем построителе запросов моей базы данных, но результат не тот, который я ожидаю. Так что это мой вопрос.Фильтрация с заданным значением AND на FK

Предположим, что у меня две таблицы, hour_entries и сотрудники;

hour_entries имеет в себе PK (obv.), А сотрудники имеют PK и FK (этот внешний ключ относится к ПК таблицы 1).

Скажем, столбцы в таблице hour_entries - это HourType (программирование, чистка и т. Д.), Описание и TotalHours (5, 2 и т. Д.). И FK, который называется EmployeeID.

В этой другой таблице (сотрудники) у вас есть только регулярная информация о сотруднике. Firstname, фамилия и т.д ..

Когда я выполнить запрос, как так

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; 

Это, кажется, чтобы дать мне информацию обратно, которая соответствует проверки для описания и hourtype. Но он также возвращает строки с другим EmployeeID.

Я хочу информацию сотрудника с данным EmployeeID. Поэтому, если вы поместите это в if-statement, это будет выглядеть так.

если (EmployeeID == givenID & & Описание == "Bla" || HourType == "Bla")

Если описание не является матч он также может выглядеть, если hourtype еще матч. Если employeeID не соответствует, я не хочу, чтобы он возвращал любую строку. Но это так и есть.

ответ

1

Вам необходимо сохранить все условия соединения в пункте On. В пункте Where они эффективно конвертируют Left Join в Inner Join. В этом конкретном случае это должно быть hour_entries.EmployeeID, а не employees.EmployeeID в Where. Также вы пропустите скобки 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 
+0

Это еще возвращает мне строки, столбцы только имеет значение NULL –

+0

Это список всех hour_entries где EmployeeID = 4 и (Описание соответствуют шаблону или HourType соответствуют шаблону), и если в EmployeeID = 4 нет записей для сотрудников - тогда FirstName, LastName и JobType имеют значение NULL. –