SQL Server *= Opérateur?
Aujourd'hui, tandis qu'à l'intérieur d'un client du système de production, j'ai trouvé une requête SQL Server qui contient un inconnu de la syntaxe. Dans l'exemple ci-dessous, ce qui ne l' *=
opérateur de faire? Je ne pouvais pas trouver aucune mention sur MSDN. La requête ne signer et renvoyer des données. Aussi loin que l'on sait, cela a été dans le système, car ils ont été à l'aide de SQL Server 2000, mais ils sont maintenant en cours d'exécution 2005.
declare @nProduct int
declare @iPricingType int
declare @nMCC int
set @nProduct = 4
set @iPricingType = 2
set @nMCC = 230
--Build SQL for factor matrix
Select distinct
base.uiBase_Price_ID,
base.nNoteRate,
base.sDeliveryOpt,
IsNull(base.nPrice,0) as nPrice,
IsNull(base.nPrice,0) + Isnull(fact.nFactor,0) as nAdjPrice,
base.iProduct_ID,
fact.iPosition as fiPosition,
base.iPosition,
CONVERT(varchar(20), base.dtDate_Updated, 101) + ' ' + CONVERT(varchar(20), base.dtDate_Updated, 108) as 'dtDate_Updated',
fact.nFactor,
fact.nTreasFactor,
product.sProduct_txt ,
pfi.sPFI_Name,
mccprod.nServicing_Fee,
fact.nNoteRate as fNoteRate,
mcc.nLRA_Charge as nLRA
From
tbl_Base_Prices base, tbl_Factors fact, tbl_Product product, tbl_PFI pfi, tbl_MCC mcc, tbl_MCC_Product mccprod
Where
base.iProduct_ID = @nProduct
And base.iProduct_ID *= fact.iProduct_ID
And base.iPosition *= fact.iPosition
And base.nNoteRate *= fact.nNoteRate
And base.iPricing_Type = @iPricingType
And fact.iMCC_ID = @nMCC
And fact.iProduct_ID = @nProduct
And mcc.iMCC_ID = @nMCC
And mcc.iPFI_ID = pfi.iPFI_ID
And mccprod.iMCC_ID = @nMCC
And mccprod.iProduct_ID = @nProduct
And base.iProduct_ID = product.iProduct_ID
and fact.iPricing_Type= @iPricingType
Order By
base.nNoteRate, base.iPosition
Vous devez vous connecter pour publier un commentaire.
Supprimer ce code immédiatement et de le remplacer avec un left join. Ce code n'est pas toujours interpréter correctement (Parfois SQL Server décide qu'il est une jointure croisée), même dans SQL Server 2000 et peut donc donner des résultats incorrects! Aussi, il est déconseillé pour l'avenir.
Je vais ajouter que dans l'ajustement à gauche rejoint vous devez éliminer tous ces autres implicite rejoint ainsi. L'implicite de la syntaxe de jointure a été obsolètes depuis 1992, il n'y a aucune excuse pour qu'il soit encore dans le code de production. Et le mélange implicite et explicite les jointures peuvent donner des résultats inattendus.
This code does not always interpret correctly (Sometimes SQL Server decides it is a cross join) even in SQL Server 2000 and thus can give incorrect results! Also it is deprecated for the future.
Je sais que c'est très vieux, mais je me demandais si vous aviez des documents à l'appui de cette déclaration? Merci!*=
et=*
rejoint.C'est une jointure externe gauche =* est une jointure externe droite.
E. g. les éléments suivants sont égaux;
CROSS JOIN
. Virgule,
etCROSS JOIN
sont exactement la même chose. C'est juste l'opérateur qui renvoie un résultat similaire à unLEFT JOIN
.*
est présent; l'ensemble de la jointure où désigne quelque chose qui n'est pas un filtre d'une jointure croisée.La syntaxe non-ANSI pour les jointures externes (
*=
et=*
) est sur le site officiel liste des fonctionnalités obsolètes, qui sera supprimée dans la prochaine version de SQL.La fonction de remplacement est le Conforme à la norme ANSI syntaxe de JOINTURE.
*=
et=*
était propriétaire de la syntaxe, sans jamais aucun ANSI/ISO standard.C'est une abréviation de la syntaxe de jointure. Jetez un oeil à ce fil qui couvre ce sujet.
Transact-SQL abréviation de la syntaxe de jointure?
Je crois que ces "non-ANSI opérateurs de jointure externe". Votre niveau de compatibilité de la base de données doit être inférieur ou égal à 80.
Qui est la plus ANSI (ANSI-89) syntaxe de l'opérateur de jointure externe gauche. Je vous recommande de ne pas utiliser la syntaxe ANSI est plus détaillé et plus lisible.
*
n'a jamais été la norme ANSI.