다중 업데이트 트리거에서 여러 행 열거

Nov 19 2020

아래 표와 같은 것이 있습니다.

CREATE TABLE updates (
    id INT PRIMARY KEY IDENTITY (1, 1),
    name VARCHAR (50) NOT NULL,
    updated DATETIME
);

그리고 나는 그것을 다음과 같이 업데이트하고 있습니다.

INSERT INTO updates (name, updated)
VALUES
    ('fred', '2020-11-11),
    ('fred', '2020-11-11'),
    ...
    ('bert', '2020-11-11');

업데이트 후 트리거를 작성하고 추가 된 모든 이름을 열거하고 각 이름을 다른 테이블에 추가해야하지만 각 이름을 열거하는 방법을 알아낼 수 없습니다.

편집 :-저를 올바른 방향으로 안내해 준 사람들 덕분에 저는 SQL을 거의 알지 못합니다.

내가해야 할 일은 이런 것입니다

  • 삽입 된 foreach 이름
  • 다른 테이블에서 찾아보고
  • '이름'이 수행 한 업데이트 수 검색
  • 카운트에 1을 더하다
  • 다른 테이블로 다시 업데이트합니다.

지금은 랩톱에 액세스 할 수 없지만 다음과 같은 작업을 수행 할 수 있습니다.

BEGIN
  SET @count = (SELECT UCount from OTHERTAB WHERE name = ins.name)
  SET @count = @count + 1
  UPDATE OTHERTAB SET UCount = @count WHERE name = ins.name
  SELECT ins.name
  FROM inserted ins;
END

업데이트의 각 이름에 대해 작동합니까?

분명히 나는 ​​집합 기반 SQL 처리에 대해 읽어야 할 것입니다.

도움과 조언에 감사드립니다.

답변

LukaszSzozda Nov 19 2020 at 20:13

사용 inserted및 설정 기반 접근 방식 (루프 필요 없음) :

CREATE TRIGGER trg
ON updates
AFTER INSERT
AS
BEGIN
  INSERT INTO tab2(name)
  SELECT name
  FROM inserted;
END
DaleK Nov 19 2020 at 21:04

편집 내용을 기반으로 다음과 같은 작업을 수행합니다. 기본 설정은 사고 방식이므로 미리 계산할 필요가 없습니다 (실제로는 할 수 없습니다). 같은 테이블에서 계산하는지 다른 테이블에서 계산하는지는 명확하지 않지만 문제를 해결할 수 있다고 확신합니다.

포인트들:

  • 삽입 된 테이블을 사용하여 업데이트 할 행 결정
  • null 가능성을 고려하여 두 번째 테이블 인 경우 하위 쿼리를 사용하여 새 값을 계산합니다.

실제로 동일한 테이블을 사용하는 경우 작동합니다.

BEGIN
    UPDATE OTHERTAB SET
      UCount = COALESCE(UCount,0) + 1 
    WHERE [name] in (
        SELECT I.[name]
        FROM Inserted I
    );
END;

그러나 두 번째 테이블을 사용하는 경우 다음이 작동합니다.

BEGIN
    UPDATE OTHERTAB SET
      UCount = COALESCE((SELECT UCount+1 from OTHERTAB T2 WHERE T2.[name] = OTHERTAB.[name]),0) 
    WHERE [name] in (
        SELECT I.[name]
        FROM Inserted I
    );
END;