Il existe des tables - affectations et pays.Jointure SQL par combinaison d'ID et de plage de dates
Les affectations stockent des données historiques sur les affectations historiques des employés, et les trois champs principaux sont - person_id, effective_start_date et effective_end_date.
Pays stocke des informations sur les employés qui ont effectué des voyages à l'étranger - les champs importants sont person_id, date_from, date_to, home_country, host_country.
Et j'ai besoin de faire ce qui suit: Je dois montrer toutes les affectations, et le pays où l'employé a été à n'importe quel moment pendant l'affectation. Ce qui signifie que je dois les rejoindre par jointure externe, mais la seule façon que je peux les rejoindre est par person_id mais il y a plusieurs entrées dans chaque table (de même ID)
Alors ce que je faisais était quelque chose comme ceci:
select *
from assignments ass, employees emp
where
ass.person_id=emp.person_id
AND (emp.date_from(+) >= ass.assignment_start_date AND emp.date_to(+) <= ass.assignment_end_date)
OR (emp.date_from(+) >= ass.assignment_start_date AND emp.date_to(+) >= ass.assignment_end_date)
mais cela ne fonctionne pas car Oracle ne me permet pas de faire une instruction OU dans une jointure externe. J'ai essayé d'utiliser toute la méthode union, mais les valeurs retournées ne sont pas ce que je m'attendais - il y a des valeurs manquantes, donc la logique n'est pas correcte. Si vous avez des conseils s'il vous plaît les poster dans la même syntaxe que je fournis (syntaxe oracle) où les jointures sont faites dans la clause where, donc c'est plus facile pour moi de comprendre.
Qu'est-ce que 'dah' dans votre requête? De plus, dans votre question, vous parlez d'une table «pays» - est-ce vraiment la table des «employés»? Et enfin, pourquoi n'avez-vous pas de filtre sur "employee.date_to" dans votre requête? –
Edité quelques erreurs, ma tête est un gâchis aujourd'hui. Je suis nouveau ici et tout ici me semble si compliqué. – user3014914
Ne vous inquiétez pas, SO (StackOverflow) est assez simple une fois que vous y êtes habitué :-) –