2017-04-13 3 views
1

J'essaie de combiner la jointure intérieure et extérieure, mais je n'arrive pas à la faire fonctionner. J'ai un total de 7 tables qui doivent être réunies en une seule requête. D'abord je n'en avais que 6 et je n'avais aucun problème car tout était interne. Mais maintenant j'ai ajouté une septième table et je n'arrive pas à faire les choses correctement. Je pense que je dois utiliser OUTER JOIN en quelque sorte, mais je ne sais pas comment. Je n'utiliserai que 3 tables dans cet exemple parce que je pense pouvoir résoudre le reste si vous m'aidez à démarrer.joindre plusieurs tables avec intérieur et extérieur.

Liste de mes tableaux:

= Tableau 1 dbo.kala (Ceci est le 7ème tableau i ajouté

= Tableau2 dbo.ti

Table3 = dbo.ao

SELECT kala.kaldat 
From dbo.kala 
Where kala.kaldat Between '170407' AND '170410' 
.

La requête ci-dessus renvoie le résultat suivant:

Result1 
|kaldat | 
|2017-04-07| 
|2017-04-08| 
|2017-04-09| 
|2017-04-10| 

.

SELECT ti.startdat, ti.artnr, ti.aonr, ti.aopos, ao.prodgr 
From dbo.ti 
INNER JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos 
Where ti.startdat Between '170407' AND '170410' 

La requête ci-dessus renvoie le résultat suivant.

Result2 
ti.startdat| ti.artnr| ti.aonr|ti.aopos|ao.prodgr| 
2017-04-07 | 123  | 0001 |10  |50  | 
2017-04-10 | 456  | 0002 |20  |60  | 

Le résultat que je veux est ce (3).

Result3 
kala.kaldat| ti.artnr| ti.aonr|ti.aopos|ao.prodgr| 
2017-04-07 | 123  | 0001 |10  |50  | 
2017-04-08 |   |  |  |   | 
2017-04-09 |   |  |  |   | 
2017-04-10 | 456  | 0002 |20  |60  | 

La jonction entre dbo.kala et dbo.ti est sur kala.kaldat = ti.startdat.

J'espère que vous comprenez ce que j'essaie de faire ici. Sinon, je m'excuse d'avance et j'essaierai volontiers d'expliquer mieux. Merci d'avance!

* Notez que les 4 tables restantes qui ne sont pas dans cet exemple doivent être jointes (INNER?) Avec dbo.ti.

+0

La jointure gauche est ce que vous recherchez, mais si vous avez des critères de clause where qui impliquent la table sur la "droite" de la jointure "Left", alors il doit être placé sur la jointure ou votre jointure gauche simule une jointure interne. – xQbert

+0

vous essayez de sélectionner des données qui n'ont aucun index dans l'une des 3 tables, pour cela vous devez utiliser la jointure gauche ou la jointure externe complète en fonction de ce que vous voulez obtenir ---> voir https: //i.stack. imgur.com/66zgg.png –

+0

J'ai effectivement plus de clauses where qui sont connectées à dbo.ti ... Tout ce dont j'ai besoin de dbo.kala est la liste des dates.Ensuite, je veux que le reste des tableaux remplisse simplement les informations sur la date correcte. – SisU

Répondre

1

Sélectionnez les dates de kala, puis jointure externe ti, puis jointure externe ao.

SELECT kala.kaldat, ti.artnr, ti.aonr, ti.aopos, ao.prodgr 
FROM dbo.kala 
LEFT JOIN dbo.ti ON kala.kaldat = ti.startdat 
LEFT JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos 
WHERE kala.kaldat BETWEEN '20170407' AND '20170410'; 

(Vous devez jointure externe ao aussi, parce que si le dossier est ti extérieur-joint, sa aonr et aopos sont nuls. Si vous intérieur ao rejoint, vous obtiendriez pas de match et ainsi jeter les rangée à partir de vos résultats.)

+0

Fantastique! Je vous remercie. – SisU

2

INNER JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos

Qu'est-ce que vous voulez réaliser à l'aide nécessite

LEFT JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos

+0

Merci, mais vous n'avez pas du tout utilisé la table "kala"? – SisU

+0

Eh bien, vous pouvez ajouter ces tables vous-même en ajoutant un autre JOIN à la requête. Vous venez d'ajouter une autre jointure: 'LEFT JOIN table2 t2 ON t1.id = t2.id LEFT JOIN table3 t3 ON t1.id = t3.id' Donc, ainsi de suite. – schroedingersKat