2017-10-11 1 views
1

Je échantillon exigencecomment obtenir les données à l'aide Rejoint ou Cross appliquer

données: Tableau A:

ID name 
1 cat 
2 Dog 
3 Bird 

Tableau B:

ID name 
1 aaa 
1 bbb 
2 ccc 
2 ddd 

Tableau C:

ID name 
1 xxx 
1 yyy 
1 zzz 
2 www 

Prérequis ed sortie:

ID name name name 
1 cat aaa xxx 
1 cat bbb yyy 
1 cat null zzz 
2 Dog ccc www 
2 Dog ddd www 
3 Bird NULL NULL 

J'ai essayé avec des jointures différentes

Select a.ID,a.name,b.name,c.name from @A a 
full join @b b 
on a.ID = b.ID 
full join @c c 
on b.ID = c.ID 

Quelqu'un peut-il me suggérer la meilleure façon de procéder?

+0

Quelle est la logique derrière tout cela? Qu'essayez-vous d'accomplir? –

+0

Expliquez la logique derrière votre sortie. En outre, veuillez comprendre qu'il n'y a pas d'ordre implicite des lignes dans le SGBDR. – GurV

+0

Je suis incapable d'obtenir la logique qui est la raison pour laquelle j'ai posté ici et plus, j'ai clairement donné les données et la sortie. J'ai demandé la suggestion – mohan111

Répondre

5

Vous pouvez utiliser la fonction de fenêtre row_number pour attribuer un numéro de séquence dans chaque id dans l'ordre croissant name pour la table b et c puis effectuez une jointure complète entre eux. Enfin, une gauche ne se joindre à la table a:

with b1 as (
    select b.*, row_number() over (partition by id order by name) as rn 
    from b 
    ), 
c1 as (
    select c.*, row_number() over (partition by id order by name) as rn 
    from c 
    ) 
select a.*, t.b_name, t.c_name 
from a 
left join (
    select coalesce(b1.id, c1.id) as id, 
     b1.name as b_name, 
     c1.name as c_name 
    from b1 
    full join c1 on b1.id = c1.id 
     and b1.rn = c1.rn 
    ) t on a.id = t.id; 

Cela suppose que vous devez joindre les tables b et c fonction de l'ID et la position (dans l'ordre de name colonne).

+0

parfait répondre à la nécessité – mohan111

+0

Peut-être que c'est la seule raison, lire Stack Overflow est plus utile que de perdre du temps sur Facebook. @GurV, Pouvez-vous s'il vous plaît expliquer un peu plus sur la logique que vous avez utilisée ici. J'ai également besoin de mettre en œuvre la même logique dans mon projet. Des tonnes de remerciements d'avance. –