J'essaie de find une alternative à l'utilisation d'un FULL OUTER JOIN pour une procédure stockée que j'écris. Voici le scénario.
Deux arrays de données principalement non liées représentant les events qui doivent se produire. Les events doivent être traités dans l'ordre chronologique et les deux tables ont une colonne datetime. Je dois donc get une seule table qui agit comme une list de TOUS ces events commandés par datetime (ces deux colonnes datetime doivent être mélangées).
Un petit accroc: parfois les events des deux tables seront liés, et dans ce cas, l'événement du tableau A doit passer en premier quel que soit le datetime. Donc, si A a 3 events, et B a 3 events, mais qu'il y a une seule paire apparentée entre A et B, je veux returnner 5 lignes. Dans le cas où il y a des données non liées, il y aura des données NULL (et c'est correct, j'utilise des vérifications de données NULL pour déterminer ce qu'il faut faire ensuite, par exemple l'événement de process A ou B, etc.)
Actuellement ce que j'ai ressemble à ceci:
SELECT CASE WHEN A.EventDateTime IS NULL THEN B.EventDateTime ELSE A.EventDateTime END AS SortDateTime, A.EventId, B.EventId, FROM A FULL OUTER JOIN B ON A.RelatedData=B.RelatedData ORDER BY SortDateTime
Cela devrait être bien
également au lieu d'utiliser CASE
CASE WHEN A.EventDateTime IS NULL THEN B.EventDateTime ELSE A.EventDateTime END AS SortDateTime,
tu peux le faire
COALESCE(A.EventDateTime,B.EventDateTime) AS SortDateTime,
Lequel est un peu plus court
Si vous voulez vraiment éviter l'OUTER JOIN, vous pouvez essayer
SELECT A.EventDateTime, A.EventID FROM A UNION ALL SELECT B.EventDateTime, B.EventID FROM B WHERE B.RelatedData NOT IN (SELECT RelatedData FROM A)
Le NOT IN
ci-dessus peut être écrit comme NOT EXISTS SELECT 1 FROM A WHERE A.RelatedData = B.RelatedData
ou comme LEFT JOIN ... IS NULL
si votre SGBDR a des preferences (ou si la sous-requête corrélée est meilleure pour votre set de données) .
S'il n'y a pas de relation exacte entre les deux, je ne vois pas d'autre moyen de le faire.