I have two tables and I would like to update the Possession column in Table1 when day is between StartDay and EndDay of Table2.
Table1
| CompanyId | Day | GroupId | Possession |
|---|---|---|---|
| 99 | 1 | 1 | 0 |
| 99 | 1 | 2 | 0 |
| 99 | 2 | 1 | 0 |
| 99 | 2 | 2 | 0 |
| 99 | 3 | 1 | 0 |
| 99 | 3 | 2 | 0 |
| 99 | 4 | 1 | 0 |
| 99 | 4 | 2 | 0 |
| 99 | 5 | 1 | 0 |
| 99 | 5 | 2 | 0 |
| 99 | 6 | 1 | 0 |
| 99 | 6 | 2 | 0 |
| 99 | 7 | 1 | 0 |
| 99 | 7 | 2 | 0 |
| 99 | 8 | 1 | 0 |
| 99 | 8 | 2 | 0 |
| 99 | 9 | 1 | 0 |
| 99 | 9 | 2 | 0 |
| 99 | 10 | 1 | 0 |
| 99 | 10 | 2 | 0 |
Table2
| CompanyId | GroupId | StartDay | EndDay |
|---|---|---|---|
| 99 | 1 | 1 | 3 |
| 99 | 2 | 4 | 5 |
| 99 | 1 | 6 | 7 |
| 99 | 2 | 8 | 10 |
This is the update statement I wrote but Table1 is only updating for the first row of Table2. I need it to update for every row of Table2.
UPDATE Table1
SET Table1.Possession =
CASE
WHEN a.Day BETWEEN b.StartDay AND b.EndDay
AND a.GroupId = b.GroupId
THEN 1
ELSE 0
END
FROM Table1 a
INNER JOIN Table2 b ON a.CompanyId = b.CompanyId
This is my desired outcome
| CompanyId | Day | GroupId | Possession |
|---|---|---|---|
| 99 | 1 | 1 | 1 |
| 99 | 1 | 2 | 0 |
| 99 | 2 | 1 | 1 |
| 99 | 2 | 2 | 0 |
| 99 | 3 | 1 | 1 |
| 99 | 3 | 2 | 0 |
| 99 | 4 | 1 | 0 |
| 99 | 4 | 2 | 1 |
| 99 | 5 | 1 | 0 |
| 99 | 5 | 2 | 1 |
| 99 | 6 | 1 | 1 |
| 99 | 6 | 2 | 0 |
| 99 | 7 | 1 | 1 |
| 99 | 7 | 2 | 0 |
| 99 | 8 | 1 | 0 |
| 99 | 8 | 2 | 1 |
| 99 | 9 | 1 | 0 |
| 99 | 9 | 2 | 1 |
| 99 | 10 | 1 | 0 |
| 99 | 10 | 2 | 1 |
CodePudding user response:
Your join condition is not correct, each row from a is matching with each row of b so you are updating each row of a 4 times, which 1 of the 4 should be used?
You could use an outer join with all criteria but this is better written using exists
Update a
set a.possession=
case when exists (
select * from table2 b
where b.CompanyId=a.companyId
and b.groupId=a.groupId
and a.day between b.startday and b.endday
) then 1 else 0 end
from
table1 a;
