SQL Server несоответствие количества строк в запросах SELECT и UPDATE с одинаковыми условиями - PullRequest
2 голосов
/ 07 июня 2019

Я пытаюсь сопоставить обновление и выбрать количество запросов с тем же условием. но количество строк идет с большой разницей.

ОБНОВЛЕНИЕ Запрос:

 UPDATE  MKP set MKP.Quantity =  MKP.Quantity + LQD.Quantity, ModifiedDate = GETDATE()
         FROM IM_MarketPlace MKP 
              INNER JOIN IM_ChannelListings CL ON MKP.ListingID = CL.ListingID 
              INNER JOIN @ListingQuantityData LQD ON LQD.ChanelListingID = RTRIM(LTRIM((CL.ChannelListingID)))  and LQD.SalesChannelID = CL.ChannelID
              Left outer join IM_ListingVariations LV on LV.ListingCode = RTRIM(LTRIM((LQD.VariationSKU))) and  MKP.ListingVariationID = LV.ID and CL.ListingID=LV.ListingID
         WHERE MKP.IsActive =1 and MKP.IsDeleted=0 and CL.IsActive =1 and CL.IsDeleted=0 
               AND (LQD.VariationSKU is null OR (LQD.VariationSKU = LV.ListingCode and lv.ID = MKP.ListingVariationID))

Выбор запроса

select count(mkp.ListingID) FROM IM_MarketPlace MKP 
              INNER JOIN IM_ChannelListings CL ON MKP.ListingID = CL.ListingID 
              INNER JOIN @ListingQuantityData LQD ON LQD.ChanelListingID = RTRIM(LTRIM((CL.ChannelListingID)))  and LQD.SalesChannelID = CL.ChannelID
              Left outer join IM_ListingVariations LV on LV.ListingCode = RTRIM(LTRIM((LQD.VariationSKU))) and  MKP.ListingVariationID = LV.ID and CL.ListingID=LV.ListingID
         WHERE MKP.IsActive =1 and MKP.IsDeleted=0 and CL.IsActive =1 and CL.IsDeleted=0 
               AND (LQD.VariationSKU is null OR (LQD.VariationSKU = LV.ListingCode and lv.ID = MKP.ListingVariationID))

Пожалуйста, помогите мне в этом.

и, пожалуйста, дайте мне знать, как @@ rowcount будет работать для запроса на обновление.

1 Ответ

2 голосов
/ 07 июня 2019

это произойдет, если между двумя таблицами, участвующими в объединениях, существует отношение один ко многим.

SELECT будет считать все строки, включая те, которые умножены на соединение. UPDATE будет просто считать уникальные строки в IM_MarketPlace, затронутые UPDATE.

При наличии отношения один ко многим не определено, какая из «многих» строк, соединяющихся с определенной строкой в ​​IM_MarketPlace, используется в качестве источника в обновлении для этой строки.

...