Ik heb een database met account numbers
en card numbers
. Ik combineer deze op een bestand in UPDATE
elke kaartnummers naar het accountnummer, zodat ik alleen met accountnummers werk.
Ik heb een weergave gemaakt met de tabel aan de account / kaartdatabase om de Table ID
en het gerelateerde accountnummer weer te geven, en nu moet ik die records bijwerken wanneer de ID overeenkomt met het accountnummer .
Dit is de Sales_Import
Tabel, waar het account number
Field moet worden bijgewerkt:
LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
En dit is de RetrieveAccountNumber
Tabel, waar ik moet updaten van:
LeadID AccountNumber
147 7006100100007266957
150 7006100100007267039
Ik heb het onderstaande geprobeerd, maar geen geluk tot nu toe:
UPDATE [Sales_Lead].[dbo].[Sales_Import]
SET [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import]. LeadID =
RetrieveAccountNumber.LeadID)
Het werkt de kaartnummers bij op accountnummers, maar de accountnummers worden vervangen door null
1, Autoriteit 100%
Ik geloof een UPDATE FROM
met een JOIN
helpt:
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 en MariaDB
UPDATE
Sales_Import SI,
RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID;
Antwoord 2, autoriteit 20%
De eenvoudige manier om de inhoud van de ene tabel naar de andere te kopiëren is als volgt:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
U kunt ook de voorwaarde toevoegen om de specifieke gegevens gekopieerd te krijgen.
Antwoord 3, autoriteit 11%
Voor SQL Server 2008 + Het gebruik van MERGE
in plaats van de propriëtaire UPDATE ... FROM
-syntaxis heeft enige aantrekkingskracht.
Het is niet alleen standaard SQL en dus draagbaarder, het zal ook een fout opleveren in het geval dat er meerdere samengevoegde rijen zijn aan de bronzijde (en dus meerdere mogelijke verschillende waarden om te gebruiken in de update) in plaats van de definitieve resultaat niet deterministisch zijn.
MERGE INTO Sales_Import
USING RetrieveAccountNumber
ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
UPDATE
SET AccountNumber = RetrieveAccountNumber.AccountNumber;
Helaas komt de keuze om te gebruiken misschien niet alleen neer op de voorkeursstijl. De implementatie van MERGE
in SQL Server is geplaagd door verschillende bugs. Aaron Bertrand heeft een lijst samengesteld van de gerapporteerde hier.
Antwoord 4, autoriteit 8%
Algemeen antwoord voor toekomstige ontwikkelaars.
SQL-server
UPDATE
t1
SET
t1.column = t2.column
FROM
Table1 t1
INNER JOIN Table2 t2
ON t1.id = t2.id;
Oracle (en 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;
Antwoord 5, autoriteit 3%
Voor PostgreSQL:
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
Antwoord 6, autoriteit 2%
Het lijkt erop dat u MSSQL gebruikt, en als ik het me goed herinner, gaat het als volgt:
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
Antwoord 7, autoriteit 2%
Ik had hetzelfde probleem met foo.new
ingesteld op null
voor rijen van foo
die geen overeenkomende sleutel hadden in bar
. Ik deed zoiets als dit in Oracle:
update foo set foo.new = (selecteer bar.new van bar waarbij foo.key = bar.key) waar bestaat (selecteer 1 van bar waarbij foo.key = bar.key)
Antwoord 8, autoriteit 2%
Dit is wat voor mij werkte in SQL Server:
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Antwoord 9, autoriteit 2%
Voor MySql werkt dat prima:
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
Antwoord 10
Bedankt voor de reacties. Ik heb een oplossing gevonden.
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)
Antwoord 11
In het geval dat de tabellen in een andere database staan. (MSSQL)
update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
inner join
database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
12
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 ;
13
De onderstaande sql die iemand heeft voorgesteld, werkt niet in SQL Server. Deze syntaxis herinnert me aan mijn oude schoolklasse:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
Alle andere zoekopdrachten met NOT IN
of NOT EXISTS
worden niet aanbevolen. NULL’s verschijnen omdat OP de volledige dataset vergelijkt met een kleinere subset, dan zal er natuurlijk een matchingsprobleem zijn. Dit moet worden opgelost door de juiste SQL te schrijven met de juiste JOIN
in plaats van het probleem te ontwijken door NOT IN
te gebruiken. U kunt andere problemen tegenkomen door in dit geval NOT IN
of NOT EXISTS
te gebruiken.
Mijn stem voor de bovenste, wat een conventionele manier is om een tabel bij te werken op basis van een andere tabel door lid te worden van SQL Server. Zoals ik al zei, je kunt geen twee tabellen gebruiken in dezelfde UPDATE
-instructie in SQL Server, tenzij je ze eerst samenvoegt.
Antwoord 14
update van de ene tafel naar de andere tafel op id die overeenkomt
UPDATE
TABLE1 t1,
TABLE2 t2
SET
t1.column_name = t2.column_name
WHERE
t1.id = t2.id;
Antwoord 15
update binnen dezelfde tabel:
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
Antwoord 16
het werkt met 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
);
Antwoord 17
Dit is de gemakkelijkste en beste die Mysql en Maria DB ooit hebben gezien
UPDATE table2, table1 SET table2.by_department = table1.department WHERE table1.id = table2.by_id
Opmerking: als u de volgende fout tegenkomt op basis van uw Mysql/Maria DB-versie “Foutcode: 1175. U gebruikt de veilige update-modus en u probeerde een tabel bij te werken zonder een WHERE die een KEY-kolom gebruikt Om de veilige modus uit te schakelen , schakel de optie in Voorkeuren”
Voer de code vervolgens als volgt uit
SET SQL_SAFE_UPDATES=0;
UPDATE table2, table1 SET table2.by_department = table1.department WHERE table1.id = table2.by_id
Antwoord 18
Ik dacht dat dit een eenvoudig voorbeeld was, misschien dat iemand het gemakkelijker kan krijgen,
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
Antwoord 19
MYSQL(Dit is mijn favoriete manier om allespecifieke kolom reasonId
waarden te herstellen, gebaseerd op primaire sleutel id
gelijkwaardigheid)
UPDATE `site` AS destination
INNER JOIN `site_copy` AS backupOnTuesday
ON backupOnTuesday.`id` = destination.`id`
SET destdestination.`reasonId` = backupOnTuesday.`reasonId`
Antwoord 20
probeer dit:
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
Antwoord 21
Oracle 11g
merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
Antwoord 22
Hiermee kunt u een tabel bijwerken op basis van de kolomwaarde die niet in een andere tabel wordt gevonden.
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
)
Hiermee wordt een tabel bijgewerkt op basis van de kolomwaarde die in beide tabellen wordt gevonden.
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
)
Antwoord 23
Ik wil nog iets extra’s toevoegen.
Werk een waarde niet bij met dezelfde waarde, dit genereert extra logboekregistratie en onnodige overhead.
Zie onderstaand voorbeeld – het zal de update alleen uitvoeren op 2 records ondanks het koppelen op 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
Antwoord 24
Als bovenstaande antwoorden niet werken, probeer dit dan
Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID