SQL Server 에서이 테이블을 '부모'테이블의 데이터 로 업데이트해야합니다 ( 아래 참조).
테이블 : 판매
id (int)
udid (int)
assid (int)
테이블 : ud
id (int)
assid (int)
sale.assid
업데이트 할 올바른 값을 포함합니다 ud.assid
.
어떤 쿼리를 수행합니까? 나는 생각하고 join
있지만 가능 여부는 확실하지 않습니다.
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 서버 :
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 절 에서 대상 테이블을 반복해서는 안됩니다 .
신탁:
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
);
set assid = s.assid
있어야한다고 생각 set u.assid = s.assid
합니다.
=
두 개 이상의 행을 반환 하면 어떻게됩니까 ?
update ud set assid = s.assid
표준 SQL 접근 방식은
UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)
SQL Server에서는 조인을 사용할 수 있습니다
UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id
WHERE
추가 열에서 일치시키려는 경우 절에 조건을 추가 할 수 있습니다 .
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 및 123456과 같은 some_column은 데모 테이블 이름, 열 이름 및 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]
FROM 키워드를 사용하는 다음 명령문은 조인으로 여러 행을 업데이트하는 데 사용됩니다.
UPDATE users
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division
where 절을 잊어 버리고 ON 조건에 모든 조건을 배치하면 최상의 성능을 얻을 수 있습니다.
쿼리가 먼저 테이블을 조인해야하고 where 절을 실행해야하기 때문에 조인하는 데 필요한 것을 줄이면 결과를 얻거나 udpate를 수행하는 가장 빠른 방법입니다.
사용자 테이블이 있습니다. 사용자 이름이나 이메일 또는 account_number를 사용하여 로그인 할 수 있습니다. 이러한 계정은 활성 (1) 또는 비활성 (0) 일 수 있습니다. 이 테이블에는 50000 개의 행이 있습니다.
그런 다음 한 번에 사용하지 않도록 설정할 사용자 테이블이 있습니다. 그러나이 표에는 사용자 이름, 이메일 및 계정 번호가 혼합 된 하나의 열이 있습니다. 또한 "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 번 확인하여 결합해야하는지 확인하고 더 많은 행을 리턴해야합니다. 그러나 더 많은 조건을 제공하면 참여할 때 모든 조건을 충족하지 않으면 많은 행을 "건너 뛸 수"있습니다.
더 읽기 쉽습니다. 모든 조건이 한 곳에 있고 업데이트 할 행이 한 곳에 있습니다
그리고 MS ACCESS에서 :
UPDATE ud
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;
가장 간단한 방법은 SQL 2005에 도입 된 CTE (Common Table Expression )를 사용 하는 것입니다.
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
SQLite의 경우 RowID 속성을 사용하여 업데이트하십시오.
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');