Question

La semaine dernière, je fus surpris de découvrir que sybase 12 ne supporte pas les jointures externes pleine. Mais il me est apparu qu'une jointure externe complète devrait être la même que celle d'une jointure externe gauche avec une jointure filles fusionnées externe droite de la même sql. Quelqu'un peut-il penser à une raison pour laquelle ce ne serait pas réalité?

Était-ce utile?

La solution

UNION-ing deux déclarations de OUTER JOIN devrait se traduire par des lignes en double représentant les données que vous obtiendrez d'un INNER JOIN. Vous auriez probablement faire un SELECT DISTINCT sur l'ensemble des données produites par le UNION. En général, si vous devez utiliser un SELECT DISTINCT cela signifie qu'il est pas bien conçu requête (ou alors je l'ai entendu).

Autres conseils

Si vous les union avec UNION ALL, vous obtiendrez des doublons. Si vous utilisez juste UNION sans ALL, il filtre les doublons et donc équivalent à une jointure complète, mais la requête sera également beaucoup plus cher, car il doit effectuer une sorte distincte.

UNION ALL la gauche se joindre à la jointure droite, mais limiter le droit jointure aux lignes seulement qui n'existent pas dans la table de base (return null sur la jointure quand ils ne seraient pas nulles dans le tableau si elles existaient).

Pour ce code, vous devez créer deux tables t1 et t2. t1 doit avoir une colonne appelée c1 avec cinq lignes contenant les valeurs 1-5. t2 doit également avoir une colonne c1 à cinq rangées contenant les valeurs 2-6.

Full jointure externe:

select * from t1 full outer join t2 on t1.c1=t2.c1 order by 1, 2;

jointure externe équivalent:

select t1.c1, t2.c1 from t1 left join  t2 on t1.c1=t2.c1
union all
select t1.c1, t2.c1 from t1 right join t2 on t1.c1=t2.c1 
where t1.c1 is null
order by 1, 2;

Notez la clause where à droite rejoint select qui limite les résultats que ceux qui ne seraient pas des doublons.

  1. Eh bien d'abord, je ne sais pas pourquoi vous utilisez 12.x. Il était EndOfLifed le 31 déc 2009, après avoir été informé le 3 avr 2007. 15.0. 2 (première version solide) est sorti en janvier 2009. 15.5 est beaucoup mieux et était disponible le 2 décembre 2009, vous êtes donc deux versions majeures, et sur au moins 13 mois, de la date.

  2. ASE 12.5.4 a la nouvelle syntaxe de jointure. (Vous n'avez pas spécifié, vous pouvez être sur 12.5.0.3, la libération avant que).

  3. DB2 et Sybase ne mettent pas en œuvre FULL OUTER JOIN, précisément pour la raison que vous avez identifié: il est couvert par LEFT ... UNION ... RIGHT sans ALL. Il est pas un cas de « ne pas soutenir » une OFJ; il est un cas du mot-clé est manquante.

  4. Et puis vous avez le problème que Sybase et DB2 types utiliseraient généralement jamais les jointures externes et encore moins FOJs, parce que leurs bases de données ont tendance à être plus normalisés, etc.

  5. Enfin, il est parfaitement SQL ordinaire que vous pouvez utiliser dans une version de Sybase qui fournira la fonction de OFJ, et sera nettement plus rapide sur 12.x; que marginalement plus rapide sur 15.x. Il est un peu comme la fonction RANK ():. Tout à fait inutile si vous pouvez écrire un sous-requête

  6. La deuxième raison pour laquelle il n'a pas besoin FULL OUTER, comme certains des moteurs bas de gamme font, parce que la nouvelle Optimiseur est extrêmement rapide, et la requête est entièrement normalisée. C'est à dire. il effectue la gauche et la droite en une seule passe.

  7. Selon vous et arguments de recherche de type de données, discordances etc, il peut encore avoir à trier de fusion, mais aussi diffusé en continu à trois niveaux: le disque sous-système E / S; moteur (s); et gestionnaire de réseau. Si vos tables sont partitionnées, il est en outre parallélisé à ce niveau.

  8. Si votre serveur n'est pas configuré et votre jeu de résultats est très grande, vous devrez peut-être augmenter proc cache size et number of sort buffers. C'est tout.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top