2015-07-16 1 views
0

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)

enter image description here 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.

+0

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? –

+0

Edité quelques erreurs, ma tête est un gâchis aujourd'hui. Je suis nouveau ici et tout ici me semble si compliqué. – user3014914

+0

Ne vous inquiétez pas, SO (StackOverflow) est assez simple une fois que vous y êtes habitué :-) –

Répondre

0

Pour obtenir le résultat souhaité, vous pouvez utiliser l'approche suivante:

  • utilisation style ANSI JOIN au lieu de la syntaxe Oracle pas à jour (ils sont beaucoup plus souples et à mon avis aussi plus lisible)
  • concatenate les pays (par exemple en utilisant LISTAGG)

requête:

select ass.person_id, 
     assignment_start_date, 
     assignment_end_date, 
     listagg(home_country ||'-' || host_country, ';') 
      within group (order by date_from) as countries 
    from assignments ass 
    left join employees emp 
    on ass.person_id = emp.person_id 
    AND ((emp.date_from >= ass.assignment_start_date AND 
     emp.date_from <= ass.assignment_end_date) 
    OR (emp.date_to >= ass.assignment_start_date AND 
     emp.date_to <= ass.assignment_end_date)) 
group by ass.person_id, assignment_start_date, assignment_end_date 

SQL Fiddle

+0

Modifier: nevermind. Cela a résolu mon problème. – user3014914

0

Je pense est ce que vous voulez, avec la syntaxe oracle

select ass.person_id, assignment_start_date, assignment_end_date, 
emp.home_country,emp.host_country 
from assignments ass, employees emp 
where 
ass.person_id=emp.person_id(+) 
AND (emp.date_from(+) <= ass.assignment_end_date AND emp.date_to(+) >= ass.assignment_end_date) 

SQLFiddle

+0

Il est proche de ce dont j'ai besoin, mais cela ne fonctionnera pas dans les cas où assignment_start_date date_to – user3014914

+0

Je pense que ce que vous voulez, c'est que assignment_end_date se situe entre date_from et date_end. Est-ce que les dates dans le tableau des affectations pour la même personne peuvent se chevaucher? Ou les dates du tableau des employés peuvent-elles se chevaucher? –

+0

La logique est la suivante: si à un moment donné de l'affectation, l'employé se trouvait dans un pays différent, j'ai besoin d'afficher les colonnes à partir de la table des employés. De plus, pendant une affectation, l'employé ne voyagera jamais dans deux pays différents. – user3014914