SQL Server * = Оператор?

Сегодня, находясь внутри клиентской системы производства, я нашел запрос 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 

Ответ 1

Немедленно удалите этот код и замените его левым соединением. Этот код не всегда правильно интерпретируется (иногда SQL Server решает, что это перекрестное соединение) даже в SQL Server 2000 и, следовательно, может дать неверные результаты! Также он устарел для будущего.

Я собираюсь добавить, что при настройке на левые соединения вы также должны удалить все другие неявные соединения. Синтаксис неявного соединения был устаревшим с 1992 года, нет оправдания тому, что он все еще находится в производственном коде. И смешивание неявных и явных объединений может дать неожиданные результаты.

Ответ 2

Это левое внешнее соединение, = * - правое внешнее объединение.

например. следующие равны:

  SELECT * FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.FK_ID

  SELECT * FROM Table1, Table2 WHERE Table1.ID *= Table2.FK_ID

Ответ 3

Синтаксис не ANSI для внешних соединений (*= и =*) находится в официальном списке устаревших функций, которые будут удалены в следующем версии SQL.

Следующая база данных SQL Server Функции двигателя не поддерживаются в следующей версии SQL Server. Делать не использовать эти функции в новых разработки и изменения приложения, которые в настоящее время используют эти как можно скорее.

Функция замены - ANSI-совместимый синтаксис JOIN.

Ответ 5

Я считаю, что это "внешние ANSI-соединения без ANSI". Уровень совместимости вашей базы данных должен быть 80 или ниже.

Ответ 6

Чтобы старый синтаксис ANSI (ANSI-89) оставил внешний оператор объединения. Я бы рекомендовал не использовать его - синтаксис ANSI является более подробным и более читаемым.