web-dev-qa-ko.com

SQL JOIN UP UPDATE

이 테이블을 SQL Server 2005 / '부모'테이블의 데이터로 업데이트해야합니다. 아래를 참조하십시오.

판매

id (int)
udid (int)
assid (int)

ud

id  (int)
assid  (int)

sale.assid에는 ud.assid를 (를) 업데이트 할 수있는 올바른 값이 들어 있습니다.

어떤 쿼리가이 작업을 수행할까요? 나는 join을 생각하고 있지만 가능한지 확실하지 않습니다.

1194
Ant Swift

구문은 사용하는 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 ud.assid = s.assid
from sale s 
where ud.id = s.udid;

Postgres의 경우 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
 );
2178
Eric

이 SQL Server에서 작동합니다.

update ud 
set assid = sale.assid
from sale
where sale.udid = id
131
edosoft

포스트 그레스

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 
90
user1154043

표준 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
45
MattH

PostgreSQL :

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;
35
alfonx

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입니다. 올바른 이름으로 바꿉니다.

22
Vinit Kadkol

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]
13
Yada

Teradata Aster는 목표를 달성하는 또 다른 흥미로운 방법을 제공합니다.

MERGE INTO ud --what trable 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
7
xhudik

나는 최고 게시물에있는 SQL-Server가 모두 T-SQL이지만 불행히도 Sybase가 아니기 때문에 Sybase에서 작동 할 것이라고 생각했습니다.

Sybase의 경우 별칭이 아닌 테이블 자체에 업데이트가 있어야합니다.

update ud
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid
7
Ken Goh

MySQL

Where 절을 잊어 버리고 모든 조건을 ON 식에 넣으면 최상의 성능을 얻을 수 있습니다.

나는 쿼리가 먼저 테이블에 가입해야하기 때문에 where where 절을 실행하므로 결과에 대한 금식 방법/udpate를 수행하는 데 필요한 항목을 줄일 수 있다면 이것이라고 생각합니다.

대본

사용자 목록이 있습니다. 사용자 이름이나 이메일 또는 account_number를 사용하여 로그인 할 수 있습니다. 이러한 계정은 활성 (1) 또는 비활성 (0) 일 수 있습니다. 이 테이블에는 50000 개의 행이 있습니다.

그런 다음 사용자 테이블을 사용하여 한 번에 사용 중지해야합니다. 그러나이 테이블에는 사용자 이름, 전자 메일 및 계정 번호가 혼합 된 하나의 열이 있습니다. 또한 실행되었을 때 1로 설정되어야하는 "has_run"표시기가 있습니다 (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 번 검사하여 조인해야하는지 확인하고 잠재적으로 더 많은 행을 반환해야합니다. 그러나 더 많은 조건을 부여하면 합류 할 때 모든 조건을 충족시키지 않으면 많은 행을 건너 뛸 수 있습니다.

보너스

더 읽기 쉽습니다. 모든 조건이 한 곳에 있으며 업데이트 할 행이 한 곳에 있습니다.

5
Luke Watts

FROM 키워드를 사용한 다음 명령문은 여러 행을 조인으로 갱신하는 데 사용됩니다

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division
5
Sheryar Nizar

그리고 MS Access에서 :

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;
2
Richard
UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID
2
Abdullah Yousuf

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');
1
KeithTheBiped

이걸 시도 해봐,이게 너에게 도움이 될거야.

update ud

set ud.assid = sale.assid

from ud 

Inner join sale on ud.id = sale.udid

where sale.udid is not null
1
HARSHIT RATHORE

가장 간단한 방법은 CTE (Common Table Expression) SQL 2005에 도입 된 것입니다.

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
0
Kemal AL GAZZAH