una - update select sql server 2014
ActualizaciĆ³n de SQL de una tabla a otra basada en una coincidencia de ID (19)
Tengo una base de datos con account numbers
y card numbers
. Las comparo con un archivo para update
cualquier número de tarjeta al número de cuenta, de modo que solo trabajo con números de cuenta.
Creé una vista que vinculaba la tabla con la base de datos de la cuenta / tarjeta para devolver la Table ID
la Table ID
y el número de cuenta relacionado, y ahora necesito actualizar esos registros donde la ID coincida con el Número de cuenta.
Esta es la tabla Sales_Import
, donde el campo del account number
debe actualizarse:
LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
Y esta es la tabla RetrieveAccountNumber
, donde necesito actualizar desde:
LeadID AccountNumber
147 7006100100007266957
150 7006100100007267039
Probé lo de abajo, pero hasta ahora no he tenido suerte:
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
Creo que una 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;
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
No se recomiendan todas las demás consultas que utilicen NOT IN
o NOT EXISTS
. Los valores nulos se muestran porque OP compara el conjunto de datos completo con un subconjunto más pequeño, entonces, por supuesto, habrá un problema coincidente. Esto debe solucionarse escribiendo el SQL adecuado con la JOIN
correcta en lugar de esquivar el problema utilizando NOT IN
. Es posible que tenga otros problemas utilizando NOT IN
o 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éndome en SQL Server. Como dije, no puede usar dos tablas en la misma declaración de UPDATE
en SQL Server a menos que se una a ellas primero.
Esto es lo que me funcionó en SQL Server:
UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
Esto le permitirá actualizar una tabla basada en el valor de 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 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
)
Gracias por las respuestas. Encontré una solución aunque.
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)
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 obtener los datos particulares copiados.
Me gustaría añadir una cosa extra.
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 los enlaces 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
Para MySql que funciona bien:
UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
Para PostgreSQL:
UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
Para SQL Server 2008 + El uso de MERGE
lugar de la sintaxis propietaria de UPDATE ... FROM
tiene cierto atractivo.
Además de ser un 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 origen (y, por lo tanto, múltiples valores diferentes posibles para usar en la actualización) en lugar de que el resultado final sea indeterminado .
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 que no se reduzca simplemente al estilo preferido. La implementación de MERGE
en SQL Server se ha visto afectada por varios errores. Aaron Bertrand ha compilado una lista de los reportados aquí .
Parece que estás usando MSSQL, entonces, si recuerdo bien, se hace así:
UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
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
Respuesta genérica para futuros desarrolladores.
servidor SQL
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;
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
Tuve el mismo problema con foo.new
se estableció en null
para las filas de foo
que no tenían una clave coincidente en la bar
. Hice algo como esto en Oracle:
update foo set foo.new = (select bar.new from bar where foo.key = bar.key) where exists (select 1 from bar where foo.key = bar.key)
Utilice el siguiente bloque de consulta para actualizar Table1 con Table2 basado en ID:
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
Esta es la forma más fácil de abordar este problema.
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
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
);
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