2016-05-19 3 views
0

У меня есть следующий запрос, который работает, но теперь я застрял. Я хотел бы добавить еще два фильтра, и я не совсем уверен, как это сделать. В отношении таблицы у меня есть поле, называемое отношением. Мне нужно убедиться, что данные отца вернулись или у отца или отчима в этом поле. Точно так же мне нужны материальные данные для фильтрации Мачехой, матерью. Конечно, у ученика может быть не отец или мать, но я все же хочу, чтобы данные возвращались, если у них есть один родитель.Добавление дополнительных фильтров в запрос

WHERE p.pk_PupilID IN('" & pks & "') AND rmother.Relationship IN('Mother','Stepmother') OR rfather.Relationship IN('Father','Stepfather') 

код работает до сих пор

SELECT DISTINCT p.pk_PupilID, pn.Title, pn.Forename, pn.Surname, pn.PreferredForename, father.pk_PersonID, father.Title, father.Forename, father.Surname, mother.pk_PersonID, mother.Title, mother.Forename, mother.Surname, pn.DoB, pn.Gender, h.House, p.Form, p.BoardingStatus, p.Tutor, h.Housemaster , f.Salutation 
FROM Family AS f 
LEFT JOIN RELATION AS rpupil ON f.pk_FamilyID = rpupil.fk_FamilyID 
LEFT JOIN PUPIL AS p ON rpupil.fk_PersonID = p.pk_PupilID 
LEFT JOIN PERSON AS pn ON p.pk_PupilID = pn.pk_PersonID 
LEFT JOIN HOUSE AS h ON p.fk_DepartmentID = h.fk_DepartmentID 
LEFT JOIN RELATION AS rfather ON p.pk_PupilID = rfather.fk_PersonID 
LEFT JOIN PERSON AS father ON rfather.fk_RelatedPersonID = father.pk_PersonID 
LEFT JOIN RELATION AS rmother ON p.pk_PupilID = rmother.fk_PersonID 
LEFT JOIN PERSON AS mother ON rmother.fk_RelatedPersonID = mother.pk_PersonID 
WHERE p.pk_PupilID IN('" & pks & "') 
+1

Вы убиваете 'LEFT JOIN' своим предложением' WHERE'. Это эффективно превращает его в «INNER JOIN». Любую дальнейшую фильтрацию в правой таблице «LEFT JOIN» (или в левую таблицу «ПРАВИЛЬНОЕ СОЕДИНЕНИЕ») необходимо добавить в условия «ON». – Siyual

ответ

1

Форматируемый комментарий здесь ,

Одно замечание о OR ...

Это:

WHERE p.pk_PupilID IN('" & pks & "') 
AND rmother.Relationship IN('Mother','Stepmother') 
OR rfather.Relationship IN('Father','Stepfather') 

обрабатывается следующим образом:

WHERE (
    p.pk_PupilID IN('" & pks & "') 
AND rmother.Relationship IN('Mother','Stepmother') 
    ) 
OR rfather.Relationship IN('Father','Stepfather') 

Вы должны использовать круглые скобки (), чтобы определить часть вашего WHERE, о котором вы хотите сообщить OR:

WHERE p.pk_PupilID IN('" & pks & "') 
AND (
    rmother.Relationship IN('Mother','Stepmother') 
OR rfather.Relationship IN('Father','Stepfather') 
    ) 

Таким образом, оба ваших OR вариантов положения будет также выполнять WHERE p.pk_PupilID IN('" & pks & "')

Во всяком случае, у меня нет достаточной информации, чтобы знать, будет ли это на самом деле решить проблему. Некоторые примеры данных помогли бы, чтобы мы могли знать, что возвращается, чего не должно быть, или что не должно.

-1

Если вы точно знаете, что один из четырех значений «родительских» будет заполняться вы могли бы использовать это:

where(p.pk_PupilID IN('" & pks & "') AND rmother.Relationship IN('Mother','Stepmother')) or (p.pk_PupilID in('" & pks & "') AND rfather.Relationship IN('Father','Stepfather'))