Проблема с джойнами

Рейтинг: 0Ответов: 1Опубликовано: 29.06.2023

Подскажите, почему одна процедура работает, а вторая нет?

Работает:

ALTER PROCEDURE [dbo].[UpdateCategory] 
    @ID int,
    @Name nvarchar(50),
    @Description nvarchar(50),
    @Store nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON;
    
    UPDATE Categories
    SET CategoryName = @Name,
        Description = @Description,
        StoreID = (SELECT StoreId FROM Stores WHERE StoreName = @Store)
    WHERE CategoryID = @ID;
END

Это не работает:

ALTER PROCEDURE [dbo].[UpdateCategory] 
    @ID int,
    @Name nvarchar(50),
    @Description nvarchar(50),
    @Store nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON;
    
    UPDATE Categories
    SET CategoryName = @Name,
        Description = @Description,
        StoreID = Stores.StoreId
    FROM Categories
    INNER JOIN Stores ON Categories.StoreId = Stores.StoreId
    WHERE Categories.CategoryID = @ID
END

Также не работает с лефт джойном.

Ответы

▲ 0Принят

Для начала я бы посоветовал выполнить

SELECT *
FROM Categories
INNER JOIN Stores ON Categories.StoreId = Stores.StoreId
WHERE Categories.CategoryID = @ID

и посмотреть на результат. Это может натолкнуть на мысль: "А что не так?"

Будем считать, что первая процедура правильная. Значит, есть единственное условие отбора записей "CategoryID = @ID". А JOIN во второй процедуре налагает второе условие "Categories.StoreId = Stores.StoreId", что является лишним.

Мне кажется, что первый вариант безальтернативен, так как необходимо просто получить из Stores StoreId, соотвествующий @Store, а не отбирать записи в Categories с помощью дополнительного условия JOIN.