ID 일치를 기반으로 한 테이블에서 다른 테이블로의 SQL 업데이트
는 이이 with with with with with with 데이터베이스를 있다.account numbers
★★★★★★★★★★★★★★★★★」card numbers
이을 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★update
계좌번호에 카드번호를 입력해서 계좌번호로만 작업하고 있습니다.
와 링크하는 해서 이 테이블을 했습니다.Table ID
계정 번호와 일치하는 ID의 레코드를 업데이트해야 합니다.
은 ★★★입니다.Sales_Import
서 '''는account number
필드를 갱신해야 합니다.
리드 아이디 | 어카운트 번호 |
---|---|
147 | 5807811235 |
150 | 5807811326 |
185 | 7006100100007267039 |
이게 '이거'예요.RetrieveAccountNumber
다음 중 하나:
리드 아이디 | 어카운트 번호 |
---|---|
147 | 7006100100007266957 |
150 | 7006100100007267039 |
아래를 시도해 봤지만, 아직까지는 잘 되지 않았습니다.
UPDATE [Sales_Lead].[dbo].[Sales_Import]
SET [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import]. LeadID =
RetrieveAccountNumber.LeadID)
NULL
제 생각에는UPDATE FROM
a JOIN
하다
MS SQL
UPDATE
Sales_Import
SET
Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON
SI.LeadID = RAN.LeadID;
MySQL 및 마리아DB
UPDATE
Sales_Import SI,
RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID;
한 표에서 다른 표로 내용을 복사하는 간단한 방법은 다음과 같습니다.
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
조건을 추가하여 특정 데이터를 복사할 수도 있습니다.
+ SQL Server 2008의 사용 + SQL Server 2008의 경우MERGE
UPDATE ... FROM
구문에는 어느 정도 매력이 있습니다.
표준 SQL이기 때문에 이동성이 높을 뿐만 아니라 소스 측에 여러 개의 결합 행이 있는 경우(따라서 업데이트에서 사용할 수 있는 여러 개의 다른 값) 최종 결과가 불확실한 것이 아니라 오류가 발생합니다.
MERGE INTO Sales_Import
USING RetrieveAccountNumber
ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
UPDATE
SET AccountNumber = RetrieveAccountNumber.AccountNumber;
그러나 안타깝게도 어떤 것을 사용할지 선택하는 것이 단순히 선호하는 스타일로 귀결되지는 않을 수 있습니다.「 」의 MERGE
SQL Server에서 다양한 버그가 발생하고 있습니다.애런 버트랜드가 여기 보고된 사람들의 목록을 작성했어요
미래의 개발자를 위한 일반적인 답변입니다.
SQL Server
UPDATE
t1
SET
t1.column = t2.column
FROM
Table1 t1
INNER JOIN Table2 t2
ON t1.id = t2.id;
Oracle(및 SQL Server)
UPDATE
t1
SET
t1.colmun = t2.column
FROM
Table1 t1,
Table2 t2
WHERE
t1.ID = t2.ID;
MySQL
UPDATE
Table1 t1,
Table2 t2
SET
t1.column = t2.column
WHERE
t1.ID = t2.ID;
포스트그레용SQL:
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
MSSQL을 사용하고 있는 것 같습니다만, 제 기억이 맞다면 다음과 같습니다.
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
★★★★★★★★★★★★★에서도 같은 문제가 있었습니다.foo.new
로 설정되다null
의 foo
일치하는 키가 없었다.bar
오라클에서 다음과 같은 작업을 수행했습니다.
업데이트 foofoo.new = 설정(bar.new 선택)바에서어디?키 = 바.키)존재하는 위치(선택 1)바에서어디?키 = 바.키)
SQL Server에서는 다음과 같은 작업을 수행할 수 있었습니다.
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
정상적으로 동작하는 MySql의 경우:
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
답변 감사합니다.난 해결책을 찾았다.
UPDATE Sales_Import
SET AccountNumber = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE Sales_Import.leadid =RetrieveAccountNumber.LeadID)
WHERE Sales_Import.leadid = (SELECT RetrieveAccountNumber.LeadID
FROM RetrieveAccountNumber
WHERE Sales_Import.leadid = RetrieveAccountNumber.LeadID)
테이블이 다른 데이터베이스에 있는 경우(MSSQL)
update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
inner join
database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
다음 쿼리 블록을 사용하여 ID에 따라 Table1을 Table2로 업데이트합니다.
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
이것이 이 문제에 대처하는 가장 쉬운 방법입니다.
MS SQL
UPDATE c4 SET Price=cp.Price*p.FactorRate FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid
inner join TableNamea_A cp on c4.Calcid=cp.calcid
WHERE c4..Name='MyName';
Oracle 11g
MERGE INTO TableNamea_A u
using
(
SELECT c4.TableName_A_ID,(cp.Price*p.FactorRate) as CalcTot
FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid
inner join TableNamea_A cp on c4.Calcid=cp.calcid
WHERE p.Name='MyName'
) rt
on (u.TableNamea_A_ID=rt.TableNamea_B_ID)
WHEN MATCHED THEN
Update set Price=CalcTot ;
일치하는 ID에 따라 테이블 간에 업데이트
UPDATE
TABLE1 t1,
TABLE2 t2
SET
t1.column_name = t2.column_name
WHERE
t1.id = t2.id;
아래 SQL은 SQL Server에서 작동하지 않습니다.이 구문은 예전 학교 수업을 떠올리게 합니다.
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
를 한 기타 모든 NOT IN
★★★★★★★★★★★★★★★★★」NOT EXISTS
세트 전체를 작은 하기 때문에매칭에 .OP가 전체 데이터 집합을 더 작은 하위 집합과 비교하기 때문에 NULL이 표시되므로 당연히 일치 문제가 발생합니다. SQL을 올바른 .JOIN
을 사용하여 를 회피합니다.NOT IN
보면 또 도 있어요.NOT IN
★★★★★★★★★★★★★★★★★」NOT EXISTS
★★★★★★★★★★★★★★★★★★,
SQL Server에 가입하여 다른 테이블을 기반으로 테이블을 업데이트하는 기존 방식인 상위 항목에 대한 투표입니다.말씀드렸듯이 두 을 같은 할 수 .UPDATE
SQL Server를 사용합니다.
이는 Mysql과 Maria DB에서 가장 쉽고 잘 확인되었습니다.
UPDATE table2, table1 SET table2.by_department = table1.department WHERE table1.id = table2.by_id
주의: 사용하시는 Mysql/Maria DB 버전 "Error Code: 1175"에 따라 다음 오류가 발생할 경우안전 업데이트 모드를 사용 중이며 키 열을 사용하는 WHERE가 없는 테이블을 업데이트하려고 했습니다. 안전 모드를 비활성화하려면 기본 설정에서 옵션을 전환하십시오."
그럼 이렇게 코드를 실행해 주세요.
SET SQL_SAFE_UPDATES=0;
UPDATE table2, table1 SET table2.by_department = table1.department WHERE table1.id = table2.by_id
postgresql에서 동작합니다.
UPDATE application
SET omts_received_date = (
SELECT
date_created
FROM
application_history
WHERE
application.id = application_history.application_id
AND application_history.application_status_id = 8
);
같은 테이블 내의 갱신:
DECLARE @TB1 TABLE
(
No Int
,Name NVarchar(50)
,linkNo int
)
DECLARE @TB2 TABLE
(
No Int
,Name NVarchar(50)
,linkNo int
)
INSERT INTO @TB1 VALUES(1,'changed person data', 0);
INSERT INTO @TB1 VALUES(2,'old linked data of person', 1);
INSERT INTO @TB2 SELECT * FROM @TB1 WHERE linkNo = 0
SELECT * FROM @TB1
SELECT * FROM @TB2
UPDATE @TB1
SET Name = T2.Name
FROM @TB1 T1
INNER JOIN @TB2 T2 ON T2.No = T1.linkNo
SELECT * FROM @TB1
이건 간단한 예라고 생각했는데 누군가 좀 더 쉽게 이해할 수 있을 것 같아서
DECLARE @TB1 TABLE
(
No Int
,Name NVarchar(50)
)
DECLARE @TB2 TABLE
(
No Int
,Name NVarchar(50)
)
INSERT INTO @TB1 VALUES(1,'asdf');
INSERT INTO @TB1 VALUES(2,'awerq');
INSERT INTO @TB2 VALUES(1,';oiup');
INSERT INTO @TB2 VALUES(2,'lkjhj');
SELECT * FROM @TB1
UPDATE @TB1 SET Name =S.Name
FROM @TB1 T
INNER JOIN @TB2 S
ON S.No = T.No
SELECT * FROM @TB1
다음을 수행합니다.
UPDATE
Table_A
SET
Table_A.AccountNumber = Table_B.AccountNumber ,
FROM
dbo.Sales_Import AS Table_A
INNER JOIN dbo.RetrieveAccountNumber AS Table_B
ON Table_A.LeadID = Table_B.LeadID
WHERE
Table_A.LeadID = Table_B.LeadID
MYSQL(이 방법은 모든 특정 컬럼을 복원하기 위해 권장되는 방법입니다.reasonId
, 키 「」에 「」를 설정합니다.id
등가)
UPDATE `site` AS destination
INNER JOIN `site_copy` AS backupOnTuesday
ON backupOnTuesday.`id` = destination.`id`
SET destdestination.`reasonId` = backupOnTuesday.`reasonId`
그러면 다른 테이블에서 찾을 수 없는 열 값을 기준으로 테이블을 업데이트할 수 있습니다.
UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
SELECT *
FROM (
SELECT table1.id
FROM table1
LEFT JOIN table2 ON ( table2.column = table1.column )
WHERE table1.column = 'some_expected_val'
AND table12.column IS NULL
) AS Xalias
)
그러면 두 테이블에서 발견된 열 값을 기준으로 테이블이 업데이트됩니다.
UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
SELECT *
FROM (
SELECT table1.id
FROM table1
JOIN table2 ON ( table2.column = table1.column )
WHERE table1.column = 'some_expected_val'
) AS Xalias
)
다른 답변을 요약하면 "일치"가 존재하는 경우에만 다른 테이블의 데이터를 사용하여 대상 테이블을 업데이트하는 방법은 4가지입니다.
쿼리 및 하위 쿼리:
update si
set si.AccountNumber = (
select ran.AccountNumber
from RetrieveAccountNumber ran
where si.LeadID = ran.LeadID
)
from Sales_Import si
where exists (select * from RetrieveAccountNumber ran where ran.LeadID = si.LeadID)
내부 결합:
update si
set si.AccountNumber = ran.AccountNumber
from Sales_Import si inner join RetrieveAccountNumber ran on si.LeadID = ran.LeadID
크로스 조인:
update si
set si.AccountNumber = ran.AccountNumber
from Sales_Import si, RetrieveAccountNumber ran
where si.LeadID = ran.LeadID
병합:
merge into Sales_Import si
using RetrieveAccountNumber ran on si.LeadID = ran.LeadID
when matched then update set si.accountnumber = ran.accountnumber;
모든 변형은 보다 덜 사소하고 이해하기 쉬우며, 개인적으로 나는 "내부 참여" 옵션을 선호합니다.단, 어느 것이든 사용할 수 있으므로 개발자는 필요에 따라 "더 나은 옵션"을 선택해야 합니다.
퍼포먼스 측면에서는 Join-s를 사용하는 것이 보다 바람직합니다.
Oracle 11g
merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
Oracle SQL의 경우 별칭을 사용해 보십시오.
UPDATE Sales_Lead.dbo.Sales_Import SI
SET SI.AccountNumber = (SELECT RAN.AccountNumber FROM RetrieveAccountNumber RAN WHERE RAN.LeadID = SI.LeadID);
하나 더 추가하고 싶어요.
동일한 값으로 값을 업데이트하지 마십시오. 추가 로깅과 불필요한 오버헤드가 생성됩니다.아래 예를 참조하십시오. 3개의 링크에도 불구하고 2개의 레코드에 대해서만 업데이트가 수행됩니다.
DROP TABLE #TMP1
DROP TABLE #TMP2
CREATE TABLE #TMP1(LeadID Int,AccountNumber NVarchar(50))
CREATE TABLE #TMP2(LeadID Int,AccountNumber NVarchar(50))
INSERT INTO #TMP1 VALUES
(147,'5807811235')
,(150,'5807811326')
,(185,'7006100100007267039');
INSERT INTO #TMP2 VALUES
(147,'7006100100007266957')
,(150,'7006100100007267039')
,(185,'7006100100007267039');
UPDATE A
SET A.AccountNumber = B.AccountNumber
FROM
#TMP1 A
INNER JOIN #TMP2 B
ON
A.LeadID = B.LeadID
WHERE
A.AccountNumber <> B.AccountNumber --DON'T OVERWRITE A VALUE WITH THE SAME VALUE
SELECT * FROM #TMP1
오라클
사용하다
UPDATE suppliers
SET supplier_name = (SELECT customers.customer_name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.customer_name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id);
table2 dpu에서 table1 dpm set col1 = dpu.col1을 업데이트합니다. 여기서 dpm.parameter_master_id = dpu.parameter_master_id;
위의 답변이 효과가 없는 경우 이 방법을 사용해 보십시오.
Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID
언급URL : https://stackoverflow.com/questions/224732/sql-update-from-one-table-to-another-based-on-a-id-match
'programing' 카테고리의 다른 글
SQL Server에서 SELECT를 업데이트하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
---|---|
하위 쿼리에서 여러 행을 단일 구분 필드로 "연결"하는 SQL Server 함수를 만드는 방법은 무엇입니까? (0) | 2023.04.07 |
표 변수에 색인 작성 (0) | 2023.04.07 |
Mongod가 /data/db 폴더가 없다고 불평한다. (0) | 2023.04.02 |
반응성이 좋은 디자인으로 구글 광고 크기를 조정할 수 있는 방법이 있나요? (0) | 2023.04.02 |