今日、クライアントの運用システム内で、見慣れない構文を含むSQL Serverクエリを見つけました。以下の例では、*=
演算子は?私はそれについての言及を見つけることができませんでした MSDNで 。クエリは実行され、データを返します。誰もが知っている限り、これはSQL Server 2000を使用していたときからシステムにありましたが、現在は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
このコードをすぐに削除し、左結合に置き換えます。このコードは、SQL Server 2000でも常に正しく解釈されるとは限らないため(SQL Serverがクロス結合であると判断する場合があります)、誤った結果をもたらす可能性があります。また、将来的には非推奨になります。
左結合に調整する際には、他の暗黙的な結合もすべて削除する必要があることを追加します。暗黙の結合構文は1992年以来廃止であり、それがまだ本番コードにあるという言い訳はありません。また、暗黙的結合と明示的結合を混在させると、予期しない結果が生じる可能性があります。
これは左外部結合であり、= *は右外部結合です。
例えば。以下は同じです。
SELECT * FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.FK_ID
SELECT * FROM Table1, Table2 WHERE Table1.ID *= Table2.FK_ID
外部結合の非ANSI構文(*=
および=*
)は公式にあります SQLの次のバージョンで削除される非推奨の機能のリスト 。
次のSQL Serverデータベースエンジンの機能は、SQL Serverの次のバージョンではサポートされません。これらの機能を新しい開発作業で使用しないでください。また、現在これらの機能を使用しているアプリケーションをできるだけ早く変更してください。
置換機能は ANSI準拠のJOIN構文 です。
これは簡略化された結合構文です。このトピックをカバーするこのスレッドを見てください。
それらは「非ANSI外部結合演算子」だと思います。データベースの互換性レベルは80以下である必要があります。
それは古いANSI(ANSI-89)構文の左外部結合演算子です。私はそれを使用しないことをお勧めします-ANSI構文はより冗長で、より読みやすくなっています。