SQL Server 에서 이 테이블을 '상위' 테이블의 데이터로 업데이트해야 합니다. 아래를 참조하세요.
테이블: 판매
id (int) udid (int) assid (int)
표: ud
id (int) assid (int)
sale.assid
업데이트에 대한 올바른 값이 포함되어 ud.assid
.
어떤 쿼리가 이 작업을 수행합니까? join
생각하고 있는데 가능한지 모르겠네요.
질문자 :Ant Swift
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를 사용하는 경우 이 방법이 유일한 방법일 수 있습니다(예: 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
절에서 대상 테이블을 반복해서는 안 됩니다.
신탁:
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에서는 조인을 사용할 수 있습니다.
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을 사용하여 업데이트 쿼리를 간소화했습니다.
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
참고 - 123456과 같은 first_table, second_table, third_table 및 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]
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
FROM 키워드가 있는 다음 문은 조인으로 여러 행을 업데이트하는 데 사용됩니다.
UPDATE users set users.DivisionId=divisions.DivisionId from divisions join users on divisions.Name=users.Division
where 절을 잊어버리고 모든 조건을 ON 표현식에 배치하면 최상의 성능을 얻을 수 있습니다.
쿼리가 먼저 테이블을 조인한 다음 거기에서 where 절을 실행해야 하기 때문에 이것이 조인에 필요한 것을 줄일 수 있다면 결과를 얻거나 업데이트를 수행하는 빠른 방법이기 때문이라고 생각합니다.
사용자 테이블이 있습니다. 사용자 이름, 이메일 또는 account_number를 사용하여 로그인할 수 있습니다. 이러한 계정은 활성(1) 또는 비활성(0)일 수 있습니다. 이 테이블에는 50000개의 행이 있습니다.
그런 다음 모두 나쁜 일을 했다는 것을 알게 되었기 때문에 한 번에 비활성화할 사용자 테이블이 있습니다. 그러나 이 테이블에는 사용자 이름, 이메일 및 계정 번호가 혼합된 열이 하나 있습니다. 또한 실행되었을 때 1(true)로 설정해야 하는 "has_run" 표시기가 있습니다.
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번 검사하여 조인해야 하는지 확인하고 잠재적으로 더 많은 행을 반환해야 합니다. 그러나 더 많은 조건을 제공하면 결합할 때 모든 조건을 충족하지 않는 경우 많은 행을 "건너뛸" 수 있습니다.
더 읽기 쉽습니다. 모든 조건이 한 곳에 있고 업데이트할 행이 한 곳에 있습니다.
가장 간단한 방법은 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
그리고 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의 경우 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');
출처 : http:www.stackoverflow.com/questions/1293330/how-can-i-do-an-update-statement-with-join-in-sql-server
"python -m SimpleHTTPServer"에 해당하는 Python 3은 무엇입니까? (0) | 2022.03.04 |
---|---|
Android 애플리케이션의 빌드/버전 번호는 어떻게 알 수 있습니까? (0) | 2022.03.04 |
instanceof를 호출하기 전에 null 검사가 필요합니까? (0) | 2022.03.04 |
jQuery Ajax 호출 후 리디렉션 요청을 관리하는 방법 (0) | 2022.03.04 |
git 저장소에서 디렉토리를 제거하는 방법은 무엇입니까? (0) | 2022.03.04 |