programing

LEFT JOIN을 사용하여 MySQL의 여러 테이블 업데이트

javaba 2023. 1. 19. 21:17
반응형

LEFT JOIN을 사용하여 MySQL의 여러 테이블 업데이트

테이블이 2개 있고 왼쪽 조인 내의 모든 행에 대해 T1의 필드를 업데이트하려고 합니다.

간단한 예시를 위해 다음 결과 세트의 모든 행을 업데이트합니다.

SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.id = T2.id WHERE T2.id IS NULL  

MySQL 설명서에는 다음과 같이 기술되어 있습니다.

여러 테이블 UPDATE 문에서는 SELECT 문에서 허용되는 모든 유형의 조인(LEFT JOIN 등)을 사용할 수 있습니다.

그러나 문서화된 다중 테이블 업데이트에서 적절한 구문을 찾을 수 없습니다.

올바른 구문은 무엇입니까?

UPDATE  t1
LEFT JOIN
        t2
ON      t2.id = t1.id
SET     t1.col1 = newvalue
WHERE   t2.id IS NULL

주의해 주세요.SELECT사용하는 것이 더 효율적일 것이다.NOT IN/NOT EXISTS구문:

SELECT  t1.*
FROM    t1
WHERE   t1.id NOT IN
        (
        SELECT  id
        FROM    t2
        )

퍼포먼스의 상세한 것에 대하여는, 블로그의 기사를 참조해 주세요.

불행하게도,MySQL에서는 서브쿼리의 타깃테이블을 사용할 수 없습니다.UPDATE진술서, 그렇기 때문에 당신은 덜 효율적인 방법을 고수할 필요가 있다.LEFT JOIN구문을 사용합니다.

데이터가 정규화된 시나리오에도 동일한 내용을 적용할 수 있지만, 이제 세 번째 테이블에서 찾은 값을 테이블에 포함시키게 됩니다.다음은 두 번째 테이블에서 마음에 드는 세 번째 테이블의 정보로 테이블을 업데이트할 수 있습니다.

UPDATE t1
LEFT JOIN
 t2
ON 
 t2.some_id = t1.some_id
LEFT JOIN
 t3 
ON
 t2.t3_id = t3.id
SET 
 t1.new_column = t3.column;

이는 사용자와 그룹이 있고 사용자가 그룹명의 다른 종류를 추가할 수 있는 경우에 유용합니다.따라서 원래 기존 그룹명을 사용자가 변경할 수 있는 필드에 Import할 필요가 있습니다.

Table A 
+--------+-----------+
| A-num  | text      | 
|    1   |           |
|    2   |           |
|    3   |           |
|    4   |           |
|    5   |           |
+--------+-----------+

Table B
+------+------+--------------+
| B-num|  date        |  A-num | 
|  22  |  01.08.2003  |     2  |
|  23  |  02.08.2003  |     2  | 
|  24  |  03.08.2003  |     1  |
|  25  |  04.08.2003  |     4  |
|  26  |  05.03.2003  |     4  |

표 A의 필드 텍스트를 다음과 같이 업데이트합니다.

UPDATE `Table A`,`Table B`
SET `Table A`.`text`=concat_ws('',`Table A`.`text`,`Table B`.`B-num`," from                                           
",`Table B`.`date`,'/')
WHERE `Table A`.`A-num` = `Table B`.`A-num`

다음과 같은 결과를 얻을 수 있습니다.

Table A 
+--------+------------------------+
| A-num  | text                   | 
|    1   |  24 from 03 08 2003 /  |
|    2   |  22 from 01 08 2003 /  |       
|    3   |                        |
|    4   |  25 from 04 08 2003 /  |
|    5   |                        |
--------+-------------------------+

표 B의 한 필드만 허용되지만 다음 결과를 얻습니다.

Table A 
+--------+--------------------------------------------+
| A-num  | text                                       | 
|    1   |  24 from 03 08 2003                        |
|    2   |  22 from 01 08 2003 / 23 from 02 08 2003 / |       
|    3   |                                            |
|    4   |  25 from 04 08 2003 / 26 from 05 03 2003 / |
|    5   |                                            |
+--------+--------------------------------------------+
UPDATE `Table A` a
SET a.`text`=(
        SELECT group_concat(b.`B-num`,' from ',b.`date` SEPARATOR ' / ') 
        FROM `Table B` b WHERE (a.`A-num`=b.`A-num`)
)
                DECLARE @cols VARCHAR(max),@colsUpd VARCHAR(max), @query VARCHAR(max),@queryUpd VARCHAR(max), @subQuery VARCHAR(max)
DECLARE @TableNameTest NVARCHAR(150)
SET @TableNameTest = @TableName+ '_Staging';
SELECT  @colsUpd = STUF  ((SELECT DISTINCT '], T1.[' + name,']=T2.['+name+'' FROM sys.columns
                 WHERE object_id = (
                                    SELECT top 1 object_id 
                                      FROM sys.objects
                                     WHERE name = ''+@TableNameTest+''
                                    )
                and name not in ('Action','Record_ID')
                FOR XML PATH('')
            ), 1, 2, ''
        ) + ']'


  Select @queryUpd ='Update T1
SET '+@colsUpd+'
FROM '+@TableName+' T1
INNER JOIN '+@TableNameTest+' T2
ON T1.Record_ID = T2.Record_Id
WHERE T2.[Action] = ''Modify'''
EXEC (@queryUpd)

언급URL : https://stackoverflow.com/questions/806882/update-multiple-tables-in-mysql-using-left-join

반응형