J'ai deux tables que je veux rejoindre comme suit:
Tableau 1 P>
Code1 | Code2 | Date(1) | Date(2) | Amount(1) | Amount(2) A | AA | 201802 | 201802 | 100 | 10 A | AA | 201803 | 201803 | 50 | 10
3 Réponses :
Vous pouvez essayer cela.
select
coalesce(table1.Code1,table2.Code1) as Code1,
coalesce(table1.Code2,table2.Code2) as Code2,
table1.Date1,
table2.Date2,
table1.Amount1,
table2.amount2
FROM @tab1 as Table1
Full Outer Join @tab2 as table2 ON
table1.Code1 = table2.Code1
AND table1.Code2 = table2.Code2
AND table1.date1= table2.date2
where exists (select null --to exclude records not matched by "Code 1 and Code 2"
from @tab2 as t2
where coalesce(table1.Code1,table2.Code1) = t2.Code1
and coalesce(table1.Code2,table2.Code2) = t2.Code2)
ORDER BY table1.Date1
Essayez d'ajouter cette ligne à l'une des tables: ('B', 'AA', 201802, 100) code> et voyez ce qui se passe. Est-ce que les résultats souhaités? Basé sur le commentaire de l'OP à la question ("Code 1 et Code 2 doivent correspondre") probablement pas.
Je sais ce que le résultat sera, je ne suis tout simplement pas sûr de ce que veut. J'ai déjà eu la démo de réexter prêt lorsque vous avez posté votre réponse; J'attends toujours que le OP clarifie la question.
Votre requête mise à jour doit fonctionner si vous ISnull Les colonnes CODEX.
declare @t1 table (Code1 varchar(4), Code2 varchar(4), Date1 date, Amount1 int)
declare @t2 table (Code1 varchar(4), Code2 varchar(4), Date2 date, Amount2 int)
insert into @t1
values
('A', 'AA', '2018-02-01', 100 ),
('A', 'AA', '2018-03-01', 50 ),
('A', 'AA', '2018-04-01', 30 )
insert into @t2
values
('A', 'AA', '2018-01-01', 20 ),
('A', 'AA', '2018-02-01', 10 ),
('A', 'AA', '2018-03-01', 10 )
SELECT
code1
,code2
,date1
,date2
,amount1
,amount2
FROM (
SELECT code1, code2 FROM @t1
INTERSECT
SELECT code1, code2 FROM @t2
) t0
CROSS APPLY (
SELECT
date1, date2, amount1, amount2
FROM @t1 t1
FULL OUTER JOIN @t2 t2 ON t1.Code1 = t2.Code1 and t1.Code2 = t2.Code2 and date1 = date2
WHERE
t0.code1 = isnull(t1.Code1, t2.code1)
and t0.code2 = isnull(t1.Code2, t2.code2)
) tt
ORDER BY
date1, date2
Essayez d'ajouter cette ligne à l'une des tables: ('B', 'AA', '2018-02-01', 100) code> et voyez ce qui se passe. Est-ce que les résultats souhaités? Basé sur le commentaire de l'OP à la question ("Code 1 et Code 2 doivent correspondre") probablement pas.
Requête mise à jour pour accueillir la portée qui a glissé dans les commentaires
Ma solution suggérée implique une jointure complète et une autre joindre à une table dérivée contenant toutes les combinaisons de Premièrement, créez et remplissez des données d'échantillons ( s'il vous plaît strong> Sauvez-nous cette étape dans vos prochaines questions): p> code1 code> et code2 code> qui existe dans les deux tables, à l'aide du Intersect Code> Opérateur. Code1 Code2 Date1 Date2 Amount1 Amount2
A AA NULL 201801 NULL 20
A AA 201802 201802 100 10
A AA 201803 201803 50 10
A AA 201804 NULL 30 NULL
Pouvez-vous nous montrer vos tentatives s'il vous plaît? C'est très difficile (impossible) pour nous de vous dire pourquoi le SQL que vous avez utilisé n'a pas fonctionné lorsque nous ne savions pas ce que SQL était.
À une conjecture, vous voulez peut-être un
Joindre extérieur complet code>.Et si
code1 code> oucode2 code> ne correspond pas?Est la question que pour certains des enregistrements que vous obtenez également un
null code>code1 code> etcode2 code>, que vous ne voulez pas? Si vous pouvez utiliserMOISON OUTER complet CODE> et dans votre SELECT, UTILISERISNULL (TABLEAGE1.CODE1, TABLED2.CODE1) Comme code1 CODE> etISNULL (TABLE1.CODE2 , table2.code2) sous forme de code2 code> pour s'assurer que le code est extrait de la table qui a cet enregistrement.Pouvez-vous s'il vous plaît me montrer votre tentative qu'il sera plus facile de le corriger, je pense que vous voulez une jointure extérieure complète
Le code 1 et le code 2 doivent correspondre, mais le problème est que dans certains cas, il n'y a pas d'instance de ligne pendant une date donnée et je souhaite qu'il apparaisse avec une valeur null pour la valeur.
Avec vos données d'échantillon, le moyen d'obtenir le résultat souhaité est en effet en utilisant un
Joindre complet code>. Toutefois, sur la base de vos derniers commentaires, où vous avez écrit "Code 1 et le code 2 doivent correspondre" Je ne suis pas sûr que ce soit la solution que vous recherchez - votre exemple de données ne couvre pas les cas où aucune de ces colonnes ne Correspondre donc nous ne pouvons pas savoir quelle est la sortie souhaitée pour une telle situation.Découvrez cette démo pour voir ce que je veux dire.