Хранимая процедура T-SQL выполняет select дважды? - PullRequest
0 голосов
/ 25 февраля 2019
DROP PROCEDURE showMatchOnDate
go

CREATE PROCEDURE showMatchOnDate 
     @MatchDate DATE
AS
    DECLARE @tempTeams TABLE
                       (
                           Id CHAR(3) PRIMARY KEY,
                           name VARCHAR(40),
                           nomatches INT,
                           owngoals INT,
                           othergoals INT,
                           points INT
                       )

    INSERT INTO @tempTeams(Id, name, nomatches, owngoals, othergoals, points)
        SELECT * FROM teams

    DECLARE @homeGoals INT
    DECLARE @outGoals INT
    DECLARE @homeID CHAR(3)
    DECLARE @outID CHAR(3)

    DECLARE @count INT
    DECLARE @totalAmount INT

    SET @totalAmount = (SELECT COUNT(*) FROM matches WHERE matchdate <= @MatchDate)
    SET @count = 1

    SELECT @totalAmount

    WHILE (@count <= @totalAmount)
    BEGIN
        SELECT @homeGoals = (SELECT homegoal FROM matches WHERE Id = @count)
        SELECT @outGoals = (SELECT outgoal FROM matches WHERE Id = @count)
        SELECT @homeID = (SELECT homeid FROM matches WHERE Id = @count)
        SELECT @outID = (SELECT outid FROM matches WHERE Id = @count)

        UPDATE @tempTeams
        SET nomatches = nomatches + 1
        WHERE Id = @homeID OR Id = @outID

        UPDATE @tempTeams
        SET owngoals = owngoals + @homeGoals
        WHERE Id = @homeID

        UPDATE @tempTeams
        SET owngoals = owngoals + @outGoals
        WHERE Id = @outID

        UPDATE @tempTeams
        SET othergoals = othergoals + @outGoals
        WHERE Id = @homeID

        UPDATE @tempTeams
        SET othergoals = othergoals + @homeGoals
        WHERE Id = @outID

        UPDATE @tempTeams
        SET points = points + 3
        WHERE Id = @homeID AND @homeGoals > @outGoals

        UPDATE @tempTeams
        SET points = points + 3
        WHERE Id = @outID AND @outGoals > @homeGoals

        IF @outGoals = @homeGoals
            UPDATE @tempTeams
            SET points = points + 1
            WHERE Id = @homeID OR (Id = @outID)

        SET @count = @count + 1
    END

    SELECT * FROM @tempTeams
go

По какой-то причине, когда я запускаю это, я получаю дубликат каждого элемента.который я не хочу.Очевидно, я хочу правильное значение, которое должно составлять 154 различных элемента.Но вместо этого я получаю 308, и каждый предмет дублируется.Кто-нибудь знает почему?

1 Ответ

0 голосов
/ 25 февраля 2019

Сначала проверьте вашу таблицу "команд", у вас могут быть дополнительные данные. Если это так, удалите дубликаты.

Также в соответствии с передовой практикой необходимо написать явные поля, чтобы избежать ошибок в будущем, что-токак это:

insert into @tempTeams(Id,name,nomatches,owngoals,othergoals,points)
   select Id,name,nomatches,owngoals,othergoals,points
   from teams
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...