ID 일치를 기반으로 한 테이블에서 다른 테이블로 SQL 업데이트
나는이있는 데이터베이스를 가지고 account numbers
와 card numbers
. update
계좌 번호 에 대한 카드 번호와 파일을 일치 시켜 계좌 번호로만 작업합니다.
테이블을 계정 / 카드 데이터베이스에 연결하여 Table ID
및 관련 계정 번호 를 반환하는 뷰를 만들었 으며 이제 ID가 계정 번호와 일치하는 레코드를 업데이트해야합니다.
다음은 필드를 업데이트해야하는 Sales_Import
테이블입니다 account number
.
LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
그리고 이것은 RetrieveAccountNumber
내가 업데이트해야 할 테이블입니다.
LeadID AccountNumber
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
이 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 및 MariaDB
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 +의 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 의 구현에는 다양한 버그가 있습니다. Aaron Bertrand는 여기에보고 된 사람들 의 목록을 작성했습니다 .
미래 개발자를위한 일반적인 답변.
SQL 서버
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;
MSSQL을 사용하는 것 같습니다. 올바르게 기억하면 다음과 같이 수행됩니다.
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
일치하는 키가없는 행에 대해 foo.new
설정 하는 것과 동일한 문제가 발생 했습니다 . Oracle에서 다음과 같이했습니다.null
foo
bar
foo 업데이트 set foo.new = (선택 bar.new 술집에서 여기서 foo.key = bar.key) 존재하는 곳 (선택 1 술집에서 여기서 foo.key = bar.key)
PostgreSQL의 경우 :
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
잘 작동하는 MySql의 경우 :
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
SQL Server에서 나를 위해 일한 것은 다음과 같습니다.
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
응답 해 주셔서 감사합니다. 나는 해결책을 찾았습니다.
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)
다음 쿼리 블록을 사용하여 ID에 따라 Table1을 Table2로 업데이트합니다.
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
이것이이 문제를 해결 하는 가장 쉬운 방법 입니다.
동일한 테이블 내에서 업데이트 :
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
누군가가 제안한 아래 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이 표시되며 물론 일치 문제가 있습니다. JOIN
를 사용하여 문제를 피하는 대신 올바른 SQL을 작성하여 수정해야합니다 NOT IN
. 당신은 사용하여 다른 문제가 실행될 수 있습니다 NOT IN
또는 NOT EXISTS
이 경우.
SQL Server에 가입하여 다른 테이블을 기반으로 테이블을 업데이트하는 일반적인 방법 인 상위 항목에 대한 나의 투표입니다. 앞서 말했듯이 UPDATE
먼저 조인하지 않는 한 SQL Server 에서 동일한 문에 두 개의 테이블을 사용할 수 없습니다 .
그것은 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
);
테이블이 다른 데이터베이스에있는 경우. (SQL 서버)
update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
inner join
database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
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 ;
I thought this is a simple example might someone get it easier,
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
Oracle 11g
merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
This will allow you to update a table based on the column value not being found in another table.
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
)
This will update a table based on the column value being found in both tables.
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
)
try this :
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
I'd like to add one extra thing.
Don't update a value with the same value, it generates extra logging and unnecessary overhead. See example below - it will only perform the update on 2 records despite linking on 3.
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
If above answers not working for you try this
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
'development' 카테고리의 다른 글
자바 8 목록 (0) | 2020.09.28 |
---|---|
git이 프록시 서버로 작업하기 (0) | 2020.09.28 |
HTML5 / Canvas / JavaScript를 사용하여 브라우저 내 스크린 샷 찍기 (0) | 2020.09.28 |
단일 파일의 하드 리셋 (0) | 2020.09.28 |
UTF-8 byte []를 문자열로 변환하는 방법은 무엇입니까? (0) | 2020.09.28 |