왼쪽 결합을 사용하여 MySQL에서 여러 테이블을 업데이트하십시오
-
03-07-2019 - |
문제
두 개의 테이블이 있고 왼쪽 결합의 모든 행에 대해 T1의 필드를 업데이트하고 싶습니다.
쉬운 예를 보려면 다음 결과 세트의 모든 행을 업데이트하십시오.
SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.id = T2.id WHERE T2.id IS NULL
그만큼 MySQL 매뉴얼 다음을 설명합니다.
다중 테이블 업데이트 문은 왼쪽 조인과 같은 선택 문서에서 허용되는 모든 유형의 조인을 사용할 수 있습니다.
그러나 문서화 된 다중 테이블 업데이트에서이를 수행하기위한 적절한 구문을 찾을 수 없습니다.
적절한 구문은 무엇입니까?
해결책
UPDATE t1
LEFT JOIN
t2
ON t2.id = t1.id
SET t1.col1 = newvalue
WHERE t2.id IS NULL
a SELECT
사용하는 것이 더 효율적입니다 NOT IN
/ NOT EXISTS
통사론:
SELECT t1.*
FROM t1
WHERE t1.id NOT IN
(
SELECT id
FROM t2
)
성능 세부 정보는 내 블로그의 기사를 참조하십시오.
- 불완전한 주문을 찾습니다: 의 성능
LEFT JOIN
비교NOT IN
안타깝게도, 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;
이것은 사용자와 그룹이있는 경우에 유용하며 사용자가 자신의 그룹 이름 변형을 추가 할 수 있기를 원하므로 원래 기존 그룹 이름을 사용자가있는 필드로 가져 오려고합니다. 그것을 수정할 수있을 것입니다.
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)