SQL Server에서 JOIN을 사용하여 UPDATE 문을 실행하려면 어떻게 해야 합니까?
SQL Server에서 이 테이블을 '상위' 테이블의 데이터로 업데이트해야 합니다. 아래를 참조하십시오.
표: 판매
id (int)
udid (int)
assid (int)
표: ud
id (int)
assid (int)
sale.assid
업데이트할 올바른 값이 포함되어 있습니다.ud.assid
.
어떤 쿼리가 이 작업을 수행합니까?생각나는 건join
가능할지 모르겠어요.
구문은 사용 중인 SQL DBMS에 따라 달라집니다.다음은 ANSI/ISO(모든 SQL DBMS에서 작동 가능), MySQL, SQL Server 및 Oracle에서 이를 수행하는 몇 가지 방법입니다.권장하는 ANSI/ISO 방식은 일반적으로 다른 두 가지 방법보다 훨씬 느리지만 MySQL, SQL Server 또는 Oracle 이외의 SQL DBMS를 사용하는 경우에는 SQL DBMS가 지원하지 않는 경우 등 유일한 방법이 될 수 있습니다.MERGE
):
ANSI/ISO:
update ud
set assid = (
select sale.assid
from sale
where sale.udid = ud.id
)
where exists (
select *
from sale
where sale.udid = ud.id
);
MySQL:
update ud u
inner join sale s on
u.id = s.udid
set u.assid = s.assid
SQL Server:
update u
set u.assid = s.assid
from ud u
inner join sale s on
u.id = s.udid
PostgreSQL:
update ud
set assid = s.assid
from sale s
where ud.id = s.udid;
타깃 테이블은 에서 반복해서는 안 됩니다.FROM
Postgres에 대한 조항.
Oracle:
update
(select
u.assid as new_assid,
s.assid as old_assid
from ud u
inner join sale s on
u.id = s.udid) up
set up.new_assid = up.old_assid
SQLite:
update ud
set assid = (
select sale.assid
from sale
where sale.udid = ud.id
)
where RowID in (
select RowID
from ud
where sale.udid = ud.id
);
이것은 SQL Server에서 동작합니다.
update ud
set assid = sale.assid
from sale
where sale.udid = id
포스트그레스
UPDATE table1
SET COLUMN = value
FROM table2,
table3
WHERE table1.column_id = table2.id
AND table1.column_id = table3.id
AND table1.COLUMN = value
AND table2.COLUMN = value
AND table3.COLUMN = value
표준 SQL 접근법은 다음과 같습니다.
UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)
SQL Server에서 Join을 사용할 수 있습니다.
UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id
CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);
UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;
JOIN-ing 여러 테이블을 사용하여 업데이트 쿼리를 단순화합니다.
UPDATE
first_table ft
JOIN second_table st ON st.some_id = ft.some_id
JOIN third_table tt ON tt.some_id = st.some_id
.....
SET
ft.some_column = some_value
WHERE ft.some_column = 123456 AND st.some_column = 123456
주: first_table, second_table, third_table 및 some_column(예: 123456)은 데모 테이블 이름, 열 이름 및 ID입니다.유효한 이름으로 바꿉니다.
SQL이 실제로 이식 가능하지 않은 또 다른 예도 있습니다.
MySQL의 경우 다음과 같습니다.
update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;
상세한 것에 대하여는, 복수의 테이블의 업데이트를 참조해 주세요.http://dev.mysql.com/doc/refman/5.0/en/update.html
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
Teradata Aster는 목표를 달성하는 또 다른 흥미로운 방법을 제공합니다.
MERGE INTO ud --what table should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN
UPDATE SET ud.assid = sale.assid; -- how to update
맨 위에 있는 SQL Server는 둘 다 T-SQL이기 때문에 Sybase에서 사용할 수 있을 것으로 생각했지만 아쉽게도 그렇지 않습니다.
Sybase의 경우 업데이트는 에일리어스가 아닌 테이블 위에 있어야 합니다.
update ud
set u.assid = s.assid
from ud u
inner join sale s on
u.id = s.udid
MySQL
where 절을 잊어버리고 모든 조건을 ON 식에 배치하면 최상의 성능을 얻을 수 있습니다.
이는 쿼리가 먼저 테이블을 조인해야 하고 그 다음 where 구를 실행해야 하기 때문에 조인하는 데 필요한 것을 줄일 수 있다면 결과를 얻거나 udpate를 실행하는 것이 빠르기 때문이라고 생각합니다.
예
시나리오
사용자 테이블이 있습니다.사용자 이름, 이메일 또는 account_number를 사용하여 로그인할 수 있습니다.이러한 계정은 활성화(1) 또는 비활성화(0)일 수 있습니다.이 테이블에는 50000개의 행이 있습니다.
그런 다음 사용자 테이블을 한 번에 비활성화할 수 있습니다. 사용자 모두가 잘못된 일을 저질렀다는 것을 알게 됩니다.단, 이 테이블에는 사용자 이름, 이메일 및 계정 번호가 혼재된 열이 1개 있습니다.또, 「has_run」인디케이터도 있어, 실행시에 1(true)로 설정할 필요가 있습니다.
쿼리
UPDATE users User
INNER JOIN
blacklist_users BlacklistUser
ON
(
User.username = BlacklistUser.account_ref
OR
User.email = BlacklistedUser.account_ref
OR
User.phone_number = BlacklistUser.account_ref
AND
User.is_active = 1
AND
BlacklistUser.has_run = 0
)
SET
User.is_active = 0,
BlacklistUser.has_run = 1;
추리
OR 조건만으로 조인해야 하는 경우 기본적으로 각 행을 4번 체크하여 조인 여부를 확인하고 더 많은 행을 반환할 수 있습니다.단, 추가 조건을 부여함으로써 가입 시 모든 조건을 충족하지 못할 경우 많은 행을 "건너뛰기"할 수 있습니다.
보너스
그게 더 읽기 쉬워요.모든 조건이 한 곳에 있고 업데이트할 행이 한 곳에 있습니다.
FROM 키워드를 지정한 다음 문을 사용하여 join을 사용하여 여러 행을 업데이트합니다.
UPDATE users
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division
가장 간단한 방법은 SQL 2005에서 도입된 Common Table Expression(CTE)을 사용하는 것입니다.
with cte as
(select u.assid col1 ,s.assid col2 from ud u inner join sale s on u.id = s.udid)
update cte set col1=col2
그리고 MS ACCESS에서:
UPDATE ud
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;
이거 한 번 입어보세요. 잘 어울리실 것 같아요.
update ud
set ud.assid = sale.assid
from ud
Inner join sale on ud.id = sale.udid
where sale.udid is not null
UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN aaa_test RAN ON SI.EmpID = RAN.ID
SQLite의 경우 Row를 사용합니다.업데이트할 ID 속성:
update Table set column = 'NewValue'
where RowID =
(select t1.RowID from Table t1
join Table2 t2 on t1.JoinField = t2.JoinField
where t2.SelectValue = 'FooMyBarPlease');
MySQL 5.7을 사용하는 Prestashop 사용자용
UPDATE
ps_stock_available sa
INNER JOIN ps_shop s
ON sa.id_shop = s.id_shop AND s.id_shop = 1
INNER JOIN ps_order_detail od
ON sa.id_product = od.product_id AND od.id_order = 22417
SET
sa.physical_quantity = sa.quantity + sa.reserved_quantity
이것은 예이지만, 요점은 Eric이 https://stackoverflow.com/a/1293347/5864034에서 말한 바와 같습니다.
때 더해야 요.UPDATE
한 후 한다.SET
의 표시
언급URL : https://stackoverflow.com/questions/1293330/how-can-i-do-an-update-statement-with-join-in-sql-server
'programing' 카테고리의 다른 글
SSMS 2008의 "Edit Top 200 Rows"에서 SQL을 변경하는 방법 (0) | 2023.04.07 |
---|---|
언제 이너 조인에 크로스 적용을 사용해야 하나요? (0) | 2023.04.07 |
SQL Server 값 목록에서 선택하는 방법 (0) | 2023.04.07 |
SQL Server에서의 내부 참여와 왼쪽 참여의 퍼포먼스 (0) | 2023.04.07 |
두 숫자 사이의 숫자 범위를 생성하는 방법은 무엇입니까? (0) | 2023.04.07 |