SQL문장에서 다중 UPDATE를 진행해야할 경우, 하나의 SQL문으로 통합하는 방법 채택완료

Copy
$sql3 = "
        UPDATE
            database.data1 TB1 INNER JOIN database.data2 TB2
        ON
            TB1.number = TB2.number
        SET
            TB2.YN = 'A'
          , TB2.YN_DT = now()
        WHERE
            TB1.SAVE = 'Y'
        ";

$sql4 = "
        UPDATE
            database.data1 TB1 INNER JOIN database.data2 TB2
        ON
            TB1.number = TB2.number
        SET
            TB2.YN = 'B'
          , TB2.YN_DT = now()
        WHERE
            TB1.SAVE = 'N'
        ";

 

이 SQL문장을 하나의 SQL문장으로 변경이 가능할까요? 가능하다면 자문좀 구해봅니다 ㅠ

답변 1개

채택된 답변
+20 포인트

Copy
UPDATE
    database.data1 TB1 INNER JOIN database.data2 TB2
ON
    TB1.number = TB2.number
SET
     TB2.YN = (CASE TB1.SAVE WHEN 'Y' THEN 'A' WHEN 'N' THEN 'B' END)
    ,TB2.YN_DT = now()
WHERE
    TB1.SAVE = 'Y' OR TB1.SAVE = 'N'
;
로그인 후 평가할 수 있습니다

답변에 대한 댓글 5개

트리거 사용할 경우에는 이런식으로 SQL작성하면 될까요?

[code]
CREATE TRIGGER data1_trigger
BEFORE
UPDATE ON database.data1
FOR EACH ROW
BEGIN

UPDATE
database.data1 TB1 INNER JOIN database.data2 TB2
ON
TB1.number = TB2.number
SET
TB2.YN = (CASE TB1.SAVE WHEN 'Y' THEN 'A' WHEN 'N' THEN 'B' END)
,TB2.YN_DT = now()
WHERE
TB1.SAVE = 'Y' OR TB1.SAVE = 'N'
END;
[/code]
동작을 안하진 않겠지만
질문 올리신 UPDATE 쿼리는 전체를 대상으로 하는 쿼리였고(TB1.SAVE = 'Y' / TB1.SAVE = 'N' 조건이 있기는 하나, 단수 row 하나만 업데이트하는 용도라고 보여지지 않음),
그 둘을 하나로 합친것 뿐이라서
트리거에 선언된 FOR EACH ROW 구문과 관계없이 동작할 것이므로
효율적인 트리거는 아닌것 같습니다.
효율적으로 트리거를 구성하려할때 참고할만한 자료가 있을까요 ㅠㅠ?
크론텝도 생각은 하고 있지만, 최대한 트리거로 구성해보려 합니다
전에 알려드렸던
https://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html
에서 예제가 나와있습니다.
보고 응용하시면 될것 같습니다.
감사합니다. 너무 큰도움되었네요 ㅎㅎ

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고