Actualización de SQL de una tabla a otra basada en una coincidencia de ID
Frecuentes
Visto 1,949 veces
999
Tengo una base de datos con account numbers
y card numbers
. Hago coincidir estos con un archivo para update
cualquier número de tarjeta al número de cuenta, de modo que solo estoy trabajando con números de cuenta.
Creé una vista que vincula la tabla a la base de datos de la cuenta / tarjeta para devolver el Table ID
y el número de cuenta relacionado, y ahora necesito actualizar esos registros donde la identificación coincide con el número de cuenta.
Este es el Sales_Import
mesa, donde el account number
el campo necesita ser actualizado:
LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
Y este es el RetrieveAccountNumber
tabla, desde donde necesito actualizar:
LeadID AccountNumber
147 7006100100007266957
150 7006100100007267039
Intenté lo siguiente, pero no tuve suerte hasta ahora:
UPDATE [Sales_Lead].[dbo].[Sales_Import]
SET [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import]. LeadID =
RetrieveAccountNumber.LeadID)
Actualiza los números de tarjeta a números de cuenta, pero los números de cuenta se reemplazan por NULL
24 Respuestas
1462
Yo creo un UPDATE FROM
con un JOIN
ayudará:
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 y MariaDB
UPDATE
Sales_Import SI,
RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID;
respondido 23 mar '16, 15:03
301
La forma sencilla de copiar el contenido de una tabla a otra es la siguiente:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
También puede agregar la condición para que se copien los datos en particular.
Respondido 15 Jul 13, 07:07
Esto funciona, pero no necesita table2 en FROM UPDATE table2 SET table2.col1 = table1.col1, table2.col2 = table1.col2, ... FROM table1 WHERE table1.memberid = table2.memberid - Sirentec
Esto no funcionó, pero ACTUALIZAR table2, table1 SET table2.col1 = table1.col1, ... WHERE table1.memberid = table2.memberid (mysql y phpmyadmin) - tom kuschel
159
Para SQL Server 2008 + usando MERGE
en lugar del propietario UPDATE ... FROM
la sintaxis tiene cierto atractivo.
Además de ser SQL estándar y, por lo tanto, más portátil, también generará un error en el caso de que haya varias filas unidas en el lado de la fuente (y, por lo tanto, múltiples valores diferentes posibles para usar en la actualización) en lugar de que el resultado final sea indeterminista. .
MERGE INTO Sales_Import
USING RetrieveAccountNumber
ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
UPDATE
SET AccountNumber = RetrieveAccountNumber.AccountNumber;
Desafortunadamente, la elección de cuál usar puede no depender únicamente del estilo preferido. La implementación de MERGE
en SQL Server se ha visto afectado por varios errores. Aaron Bertrand ha compilado una lista de los reportados aquí.
Respondido el 01 de diciembre de 13 a las 14:12
Nunca supe sobre la sintaxis de fusión. Es mucho más limpio que Update + Join. - Tony Ashworth
+1 para informar de la implementación de MERGE SQL Server - Fractura
¡Muchas gracias Martin! Había estado buscando esto desde hace muchos días que finalmente lo hice funcionar :) - InfantPro'Aravind '
Los argumentos para usar MERGE (incluidos los de la publicación de sqlblog.com vinculado anteriormente) puede ser convincente, pero una cosa a considerar podría ser que según MSDN: ... La instrucción MERGE funciona mejor cuando las dos tablas tienen una combinación compleja de características coincidentes ... Cuando simplemente se actualiza una tabla en función de las filas de otra tabla, se puede lograr un mejor rendimiento y escalabilidad con las instrucciones INSERT, UPDATE y DELETE básicas - Tony Pulokas
@ jkp1187 Esta pregunta está etiquetada como SQL Server. Entonces RE: FWIW - aproximadamente cero. - Martin Smith
117
Respuesta genérica para futuros desarrolladores.
SQL Server
UPDATE
t1
SET
t1.column = t2.column
FROM
Table1 t1
INNER JOIN Table2 t2
ON t1.id = t2.id;
Oracle (y 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;
Respondido 23 Oct 16, 05:10
Es de destacar que al menos para SQL Server, use el alias en lugar del nombre de la tabla en la cláusula de actualización superior (update t1...
más bien que update Table1...
) - Gordon
42
Para PostgreSQL:
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
Respondido 16 Jul 14, 20:07
El error que estoy cometiendo es: SET SI.AccountNumber = RAN.AccountNumber. Aún así, me pregunto por qué está mal en postgresql. ¿Alguien puede explicarlo? - Karan Arora
38
Parece que está usando MSSQL, entonces, si mal no recuerdo, se hace así:
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
Respondido 22 Oct 08, 08:10
35
Tuve el mismo problema con foo.new
siendo configurado en null
para filas de foo
que no tenía una clave coincidente en bar
. Hice algo como esto en Oracle:
actualizar foo set foo.new = (seleccione bar.new de la barra donde foo.key = bar.key) donde existe (seleccione 1 de la barra donde foo.key = bar.key)
Respondido 29 Abr '09, 19:04
Porque es el Donde exista ¿requerido? - Georg Scholly
Porque cada fila en foo que no tenía una coincidencia en bar terminó siendo nula, porque la instrucción select produjo un valor nulo. Espero que esto haya sido más claro que mi primer intento de explicarlo. - Kjell Andreassen
marque esta respuesta a continuación stackoverflow.com/questions/224732/… - Basheer AL-MOMANI
@KjellAndreassen Has resuelto mi problema. Gracias por tu codigo. - bhavin thummar
30
Esto es lo que funcionó para mí en SQL Server:
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Respondido el 07 de Septiembre de 18 a las 13:09
28
Para MySql que funciona bien:
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
Respondido 13 Feb 12, 16:02
21
Gracias por las respuestas. Aunque encontré una solución.
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)
contestado el 02 de mayo de 11 a las 23:05
Ya sea que el código aquí funcione o no, probablemente debería mirar las otras dos soluciones publicadas. Son mucho más claros y menos propensos a errores, así como casi con certeza más rápidos. - Tom H
Solo una nota sobre esta solución, UPDATE ... FROM es propietario, por lo tanto, si no puede usar la instrucción MERGE porque está usando SQL 2005 o anterior, este es un método compatible con ANSI para realizar actualizaciones con una fuente de tabla en MSSQL. Fuente: sqlblog.com/blogs/hugo_kornelis/archive/2008/03/10/… - pseudocodificador
la única solución que funciona para mí porque es una declaración de actualización de SQL estándar (UPDATE SET WHERE), muchas gracias - Basheer AL-MOMANI
16
En caso de que las tablas estén en bases de datos diferentes. (MSSQL)
update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
inner join
database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
Respondido 19 Abr '20, 17:04
14
Utilice el siguiente bloque de consulta para actualizar Table1 con Table2 según el ID:
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
Este es el forma más fácil para abordar este problema.
Respondido el 24 de enero de 18 a las 09:01
10
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 ;
Respondido 23 Abr '19, 07:04
5
El siguiente SQL que alguien sugirió, NO funciona en SQL Server. Esta sintaxis me recuerda a mi clase de la vieja escuela:
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
Todas las demás consultas usando NOT IN
or NOT EXISTS
no se recomiendan. Aparecen NULL porque OP compara el conjunto de datos completo con un subconjunto más pequeño, entonces, por supuesto, habrá un problema de coincidencia. Esto debe solucionarse escribiendo SQL adecuado con la JOIN
en lugar de esquivar el problema usando NOT IN
. Puede tener otros problemas al usar NOT IN
or NOT EXISTS
en este caso.
Mi voto por el de arriba, que es una forma convencional de actualizar una tabla basada en otra tabla uniéndose en SQL Server. Como dije, no puede usar dos tablas en la misma UPDATE
en SQL Server a menos que se una a ellos primero.
Respondido el 14 de diciembre de 16 a las 15:12
Solo puedo decir que en SQL Server 2017 esto funciona perfectamente bien. Solo como una nota para las personas que vengan en el futuro. No es necesario unirse a ellos. - sombra afilada
5
actualizar de una tabla a otra tabla en id coincidente
UPDATE
TABLE1 t1,
TABLE2 t2
SET
t1.column_name = t2.column_name
WHERE
t1.id = t2.id;
Respondido el 21 de diciembre de 20 a las 14:12
4
actualizar dentro de la misma tabla:
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
Respondido el 06 de diciembre de 12 a las 12:12
4
funciona con 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
);
Respondido el 02 de enero de 17 a las 11:01
2
Pensé que este es un ejemplo simple, ¿alguien podría hacerlo más fácil?
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
Respondido el 04 de junio de 12 a las 13:06
1
Oracle 11g
merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
Respondido el 21 de enero de 19 a las 16:01
1
MYSQL (Esta es mi forma preferida de restaurar todos los columna específica reasonId
valores, basados en la clave principal id
equivalencia)
UPDATE `site` AS destination
INNER JOIN `site_copy` AS backupOnTuesday
ON backupOnTuesday.`id` = destination.`id`
SET destdestination.`reasonId` = backupOnTuesday.`reasonId`
Respondido el 06 de enero de 21 a las 09:01
0
Esto le permitirá actualizar una tabla en función del valor de la columna que no se encuentra en otra tabla.
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
)
Esto actualizará una tabla basada en el valor de la columna que se encuentra en ambas tablas.
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
)
Respondido 02 Abr '15, 16:04
0
prueba esto :
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
respondido 14 nov., 16:12
-1
Me gustaría agregar algo más.
No actualice un valor con el mismo valor, genera un registro adicional y una sobrecarga innecesaria. Vea el ejemplo a continuación: solo realizará la actualización en 2 registros a pesar de que se vincule en 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
Respondido el 13 de diciembre de 16 a las 23:12
-1
Si las respuestas anteriores no funcionan para usted, intente esto
Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID
Respondido el 10 de enero de 18 a las 04:01
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas sql sql-server select join sql-update or haz tu propia pregunta.
Es posible que desee usar el alias de la tabla en la cláusula UPDATE; de lo contrario, causará problemas si se une a la tabla en cualquier momento. - Tom H
En la cláusula set debes cambiar
SI.AccountNumber
para sóloAccountNumber
de lo contrario fallará. - AaronLSMS-Access usa una ACTUALIZACIÓN diferente con la instrucción JOIN. Mira esto: sql-und-xml.de/sql-tutorial/… - Christian Ammer
esto parece estar bien para mssql pero no parece funcionar en mysql. Sin embargo, esto parece hacer el trabajo:
UPDATE Sales_Import, RetrieveAccountNumber SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
. Un poco fuera del tema, pero puede ser útil. EddCreo que no hay necesidad de una unión interna. La siguiente solución de Vonki funciona: ACTUALIZAR [Sales_Lead]. [Dbo]. [Sales_Import] SET [AccountNumber] = RetrieveAccountNumber.AccountNumber FROM RetrieveAccountNumber WHERE [Sales_Lead]. [Dbo]. [Sales_Import] .LeadID = RetrieveAccountNumber Gutti