Update a Table using a Join - sql

I wish to update a table using, but need to use another table to get the correct field. The new information is not taken from another field from another table.
The following SQL statement returns the correct information:
SELECT PURCHASEHEADER.ORDERNOTES
FROM PURCHASEHEADER, ASSEMBLYLINESOURCE
WHERE ASSEMBLYLINESOURCE.HEADERSYSUNIQUEID = 72637001
AND PURCHASEHEADER.ORDERNUMBER = ASSEMBLYLINESOURCE.PURCHASEORDERNUMBER
I have tried the following:
UPDATE PURCHASEHEADER SET PURCHASEHEADER.ORDERNOTES = 'Updated'
WHERE EXISTS (
SELECT 1 FROM ASSEMBLYLINESOURCE
WHERE PURCHASEHEADER.ORDERNUMBER = ASSEMBLYLINESOURCE.PURCHASEORDERNUMBER
) AND ASSEMBLYLINESOURCE.HEADERSYSUNIQUEID = 72637001
An error is returned saying: " ...Column Unknown ASSEMBLYLINESOURCE.HEADERSYSUNIQUEID..." but it does exist as it works in the first query.
I have seen similar posts from Mark Rotteveel dated July 2017, but still can't get it to work.

There is an issue with your closing bracket. Try this, it worked for me.
UPDATE PURCHASEHEADER set PURCHASEHEADER.ORDERNOTES = 'Updated'
WHERE EXISTS (SELECT 1 FROM ASSEMBLYLINESOURCE WHERE
PURCHASEHEADER.ORDERNUMBER = ASSEMBLYLINESOURCE.PURCHASEORDERNUMBER AND
ASSEMBLYLINESOURCE.HEADERSYSUNIQUEID = 72637001)

Related

Problem in PostgreSQL (ERROR: relation "a" does not exist)

SQL query (PostgreSQL) looks like that:
UPDATE a
SET "PropertyAddress" = COALESCE(a."PropertyAddress", b."PropertyAddress")
FROM "NashvilleHousingData" a
INNER JOIN "NashvilleHousingData" b
ON a."ParcelID" = b."ParcelID"
AND a."UniqueID" <> b."UniqueID"
WHERE a."PropertyAddress" IS NULL;
And the error is relation "a" does not exist
I tried other advices about the notion in the code public or scheme, but it still doesn't work. Please, help
This is not how Postgres handles updates with more than one table. You don't repeat the table in the from clause:
UPDATE "NashvilleHousingData" nhd
SET "PropertyAddress" = COALESCE(nhd."PropertyAddress", nhd2."PropertyAddress")
FROM "NashvilleHousingData" nhd2
WHERE nhd2."ParcelID" = nhd."ParcelID" AND
nhd2."UniqueID" <> nhd."UniqueID"
WHERE nhd."PropertyAddress" IS NULL;
Also, the COALESCE() is superfluous because the value is known to be NULL:
SET "PropertyAddress" = nhd2."PropertyAddress"

Access query: Update with a DSum in SET

I get the error "Operation must use an updateable query" when I try to run this SQL code:
UPDATE Progetti
SET Progetti.Eroso = (SELECT sum(Fatture.Fattura) FROM Fatture WHERE Fatture.[Codice Progetto] = Progetti.[Codice Progetto]);
Consider that all the tables, fields and relationships involved exist and are correctly set. The issue (according to me) is that SELECT cannot be inside SET. Is it correct?
So what can be a right solution?
The result must be: for each Progetti.[Codice Progetto] put in the field Progetti.Eroso the sum only of Fatture.Fattura related to Progetti.[Codice Progetto].
An alternative can be:
UPDATE Progetti AS a
SET a.Eroso = DSum("Fattura", "Fatture", "[Codice Progetto]=" & a.[Codice Progetto]);
But I get this warning:
EDIT
I have tried the solution of #user4321:
UPDATE Progetti
SET Progetti.Eroso = Fatture2.FatturaSum
FROM Progetti
Inner Join (SELECT sum(Fatture.Fattura) as FatturaSum
FROM Fatture) as Fatture2
ON Fatture2.[Codice Progetto] = Progetti.[Codice Progetto];
Maybe I have found why it does not work: Fatture.[Codice Progetto] is probably linked to Progetti.[ID Progetto] (that is different from Progetti.[ID Progetto]). The field is set in this way:
hope this works for you
UPDATE Progetti
SET Progetti.Eroso = Fatture2.FatturaSum
FROM Progetti
Inner Join (SELECT sum(Fatture.Fattura) as FatturaSum
FROM Fatture) as Fatture2
ON Fatture2.[Codice Progetto] = Progetti.[Codice Progetto];

SQL updating multiple cells with values from a subquery

The other day,I thought I found a very elegant way to update part of a set of cells. This is what I came up with :
Update mytable
Set ExternalLink = REPLACE (ExternalLink, R.UniqueID, R.ParentUniqueID)
From (
Select u.UniqueID, u.ParentUniqueID, RIGHT (mt.ExternalLink, 7) as EL
From uniqueidtable u
Join mytable mt
On EL = u.ParentUniqueID
Where mt.ExternalLink Like '%stringinurl%' ) R
I believe I got the idea from a stack question, but I can't find it in my history.
I can't seem to get more than one cell updated, even though the subquery returns several rows when tested alone. What's wrong with this and how can I tweak it to update multiple cells at a time?
Thank you for your help.
Okay, I came up with an answer. I'm not sure why a Table Expression did not work in this case, but here's what I came up with:
UPDATE mytable
SET ExternalLink = REPLACE(Ta.ExternalLink, T.ParentUniqueID, T.UniqueID)
FROM mytable Ta
JOIN UniqueIDtable
ON RIGHT(Ta.ExternalLink, 7) = T.ParentUniqueID
WHERE ExternalLink LIKE '%stringinurl%' AND ISNUMERIC(RIGHT(Ta.ExternalLink, 7)) = '1';
It seems I was just messing up the placement of the ID and parent ID in the replace. I also didn't count on the end of the URL string in the ExternalLink column to be anything but a numeric value, so that came up with some issues as well. It seems to be working for me now, so I've got that going for me.

sqlite3 UPDATE generating nulls

I'm trying to transition from MySQL to SQLIte3 and running into an update problem. I'm using SQLite 3.6.20 on redhat.
My first line of code behaves normally
update atv_covar set noncomp= 2;
All values for noncomp (in the rightmost column) are appropriately set to 2.
select * from atv_covar;
A5202|S182|2
A5202|S183|2
A5202|S184|2
It is the second line of code that gives me problems:
update atv_covar
set noncomp= (select 1 from f4003 where
atv_covar.study = f4003.study and
atv_covar.rpid = f4003.rpid and
(rsoffrx="81" or rsoffrx="77"));
It runs without generating errors and appropriately sets atv_covar.noncomp to 1 where it matches the SELECT statement. The problem is that it changes atv_covar.noncomp for the non-matching rows to null, where I want it to keep them as 2.
select * from atv_covar;
A5202|S182|
A5202|S183|1
A5202|S184|
Any help would be welcome.
#Dan, the problem with your query is not specific to SQLite; you are updating all rows of atv_covar, but not all of them have correspondence in f4003, so these default to NULL. You should filter the update or provide a default value.
The following statement sets 1 only to the rows that macth the filtering condition:
UPDATE atv_covar
SET noncomp = 1
WHERE EXISTS (
SELECT 'x'
FROM f4003
WHERE atv_covar.study = f4003.study
AND atv_covar.rpid = f4003.rpid
AND (rsoffrx="81" or rsoffrx="77")
);
The following statement sets 1 or 2 for all rows of noncomp, depending on the filtering match (use this instead of two updates):
UPDATE atv_covar
SET noncomp = COALESCE((
SELECT 1
FROM f4003
WHERE atv_covar.study = f4003.study
AND atv_covar.rpid = f4003.rpid
AND (rsoffrx="81" or rsoffrx="77")
), 2);

UPDATE is not allowed because the statement updates view "table_name" which participates in a join and has an INSTEAD OF UPDATE trigger

I am getting the following error while executing the following query in an Stored Procedure. Could anyone help in finding the fault?
UPDATE is not allowed because the statement updates view "sup_item" which participates in a join and has an INSTEAD OF UPDATE trigger.
UPDATE si
SET
name = mc.name,
sup_item_cat_id = mc.res_sup_item_cat_id,
xf_value = mc.xf_value,
ava_start_date = mc.ava_start_date,
ava_end_date = mc.ava_end_date,
status_code = mc.status_code,
last_mod_us_id = CASE WHEN mc.last_mod_us_id = 42 THEN #posting_us_id
ELSE mc.last_mod_us_id END,
last_mod_tsp = CURRENT_tsp
FROM sup_item AS si
JOIN merch_cat_imp_sup_item AS mc
ON mc.sup_id = si.sup_id
AND mc.res_sup_item_id = si.sup_item_id
AND mc.cat_imp_event_id = #cat_imp_event_id
AND mc.accept_flag = 'y'
WHERE si.shi_flag = 'n'
I found the reference: http://msdn.microsoft.com/en-us/library/ms177523.aspx
A view with an INSTEAD OF UPDATE trigger cannot be a target of an
UPDATE with a FROM clause.
So, I have to rewrite the UPDATE statement (it still can be in a procedure) to NOT use sup_item (which is a view), but keep the underlying table(s) as needed.
Could someone please rewrite it, if anyone knows what to do?
You can use MERGE to achieve this. Try:
MERGE INTO sup_item si
USING merch_cat_imp_sup_item AS mc
ON mc.sup_id = si.sup_id
AND mc.res_sup_item_id = si.sup_item_id
AND mc.cat_imp_event_id = #cat_imp_event_id
AND mc.accept_flag = 'y'
AND si.shi_flag = 'n'
WHEN MATCHED
THEN UPDATE
SET
name = mc.name,
sup_item_cat_id = mc.res_sup_item_cat_id,
xf_value = mc.xf_value,
ava_start_date = mc.ava_start_date,
ava_end_date = mc.ava_end_date,
status_code = mc.status_code,
last_mod_us_id = CASE WHEN mc.last_mod_us_id = 42 THEN #posting_us_id
ELSE mc.last_mod_us_id END,
last_mod_tsp = CURRENT_tsp
The issue is not within your query. As per comments on your question, the entity you are updating [sup_item], isn't actually a table, it's a view. That view has an INSTEAD OF UPDATE trigger on it.
Are you able to post the SQL for the View and for the Trigger(s)?
I would also be interested, because I have a stored procedure in a database that I have inherited which tries to do this. It won't let me create the sproc in SQL 2014, but the fact that it is there in the sproc indicates to me that an earlier version of SQL server must have allowed this.
Maybe in earlier versions your procedure operated on a table, which was later replaced by a view.
You should replace your "update from" syntax by standard ANSI syntax of update.