복붙노트

[SQL] 어떻게 SQL Server의 가입과 UPDATE 문을 할 수 있습니까?

SQL

어떻게 SQL Server의 가입과 UPDATE 문을 할 수 있습니까?

나는 아래를 참조하십시오의 '부모'테이블에서 데이터를 SQL 서버에서이 테이블을 업데이트해야합니다 :

테이블 : 판매

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

테이블 : 밖으로

id  (int)
assid  (int)

sale.assid는 업데이트 ud.assid에 대한 올바른 값이 포함되어 있습니다.

쿼리는이 무엇을 할 것인가? 내가 가입 생각하고 있지만, 나는 확실히 그것이 가능하다면 아니에요.

해결법

  1. ==============================

    1.SQL DBMS 당신이 사용하고있는 구문은 엄격하게 따라 달라집니다. 다음은 ANSI / ISO (일명 어떤 SQL DBMS에서 작동한다), MySQL은, SQL 서버, 오라클에서 할 수있는 몇 가지 방법입니다. 내 제안 ANSI / ISO 방식은 일반적으로 다른 두 방법보다 훨씬 느립니다 것이 좋습니다,하지만 당신은 SQL을 사용하는 경우 것이 MySQL은, SQL 서버, 또는 Oracle 이외의 DBMS 될 것은, 다음이 갈 수있는 유일한 방법이 될 수있다 (예를 들어, ) 당신의 SQL DBMS는 병합을 지원하지 않는 경우 :

    SQL DBMS 당신이 사용하고있는 구문은 엄격하게 따라 달라집니다. 다음은 ANSI / ISO (일명 어떤 SQL DBMS에서 작동한다), MySQL은, SQL 서버, 오라클에서 할 수있는 몇 가지 방법입니다. 내 제안 ANSI / ISO 방식은 일반적으로 다른 두 방법보다 훨씬 느립니다 것이 좋습니다,하지만 당신은 SQL을 사용하는 경우 것이 MySQL은, SQL 서버, 또는 Oracle 이외의 DBMS 될 것은, 다음이 갈 수있는 유일한 방법이 될 수있다 (예를 들어, ) 당신의 SQL DBMS는 병합을 지원하지 않는 경우 :

    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
     );
    
  2. ==============================

    2.이 SQL 서버에서 작동합니다 :

    이 SQL 서버에서 작동합니다 :

    update ud 
    set assid = sale.assid
    from sale
    where sale.udid = id
    
  3. ==============================

    3.포스트 그레스

    포스트 그레스

    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 
    
  4. ==============================

    4.표준 SQL의 접근 방식이 될 것입니다

    표준 SQL의 접근 방식이 될 것입니다

    UPDATE ud
    SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)
    

    SQL 서버에서 당신은 조인을 사용할 수 있습니다

    UPDATE ud
    SET assid = s.assid
    FROM ud u
    JOIN sale s ON u.id=s.id
    
  5. ==============================

    5.PostgreSQL의 :

    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;
    
  6. ==============================

    6.가입 - 보내고 여러 테이블을 사용하여 단순화 업데이트 쿼리.

    가입 - 보내고 여러 테이블을 사용하여 단순화 업데이트 쿼리.

       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입니다. 유효한 이름을 바꿉니다.

  7. ==============================

    7.또 다른 예는 왜 SQL 정말 이식 할 수 없습니다.

    또 다른 예는 왜 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]
    
  8. ==============================

    8.테라 데이타 애 스터는 어떻게 목표를 달성하는 또 다른 흥미로운 방법을 제공합니다 :

    테라 데이타 애 스터는 어떻게 목표를 달성하는 또 다른 흥미로운 방법을 제공합니다 :

    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
    
  9. ==============================

    9.그들은 모두 T-SQL하지만 불행히도 이후 나는베이스를 위해 일하는 것이 최고 포스트에서 SQL-서버 하나를 생각했다.

    그들은 모두 T-SQL하지만 불행히도 이후 나는베이스를 위해 일하는 것이 최고 포스트에서 SQL-서버 하나를 생각했다.

    Sybase의 경우 나는 업데이트가 테이블 자체가 아니라 별칭에 있어야 발견 :

    update ud
    set u.assid = s.assid
    from ud u
        inner join sale s on
            u.id = s.udid
    
  10. ==============================

    10.FROM 키워드 다음 문은 가입으로 여러 행을 업데이트하는 데 사용됩니다

    FROM 키워드 다음 문은 가입으로 여러 행을 업데이트하는 데 사용됩니다

    UPDATE users 
    set users.DivisionId=divisions.DivisionId
    from divisions join users on divisions.Name=users.Division
    
  11. ==============================

    11.당신이 어디에 절을 잊고 ON 표현식에서 모든 조건을 배치하면 당신은 최상의 성능을 얻을 수 있습니다.

    당신이 어디에 절을 잊고 ON 표현식에서 모든 조건을 배치하면 당신은 최상의 성능을 얻을 수 있습니다.

    나는 그래서 당신은 / 결과를 얻을 수있는 금식 방법 그 다음에 가입하는 데 필요한 UDPATE을 무엇 줄일 수 있다면,이 쿼리는 먼저 테이블을 조인하기 때문에 다음입니다에 where 절을 실행 생각합니다.

    당신은 사용자의 테이블을 가지고있다. 그들은 그들의 이름이나 이메일 또는 ACCOUNT_NUMBER를 사용하여 로그인 할 수 있습니다. 이러한 계정은 (1) 활성 또는 (0) 비활성화 할 수 있습니다. 이 테이블은 50000 개 행이

    당신은 그들이 모두 완료 뭔가 나쁜했습니다 알 수 있기 때문에 그런 다음 한 가지에 사용하지 않으려면 사용자의 테이블을 가지고있다. 이 테이블은 그러나, 혼합 사용자 이름, 이메일 및 계좌 번호에 하나의 열이 있습니다. 그것은 또한 실행 된 경우 1 (참)로 설정 될 필요가있는 "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;
    

    우리는 그것이 본질적으로 가입해야합니다 있는지 확인하기 위해 각 행에 4 번을 확인하고 잠재적으로 더 많은 행을 반환해야합니다 단지 OR 조건에 가입 한 경우. 그들이 합류 모든 조건을 충족하지 않는 경우, 그것은 더 많은 조건을 제공하여 행을 많이 "생략"할 수 있습니다.

    그것은 더 읽을 수있다. 모든 조건이 한 장소에있는 업데이트에 대한 행이 한 자리에

  12. ==============================

    12.그리고 MS Access에서 :

    그리고 MS Access에서 :

    UPDATE ud 
    INNER JOIN sale ON ud.id = sale.udid
    SET ud.assid = sale.assid;
    
  13. ==============================

    13.가장 간단한 방법은 SQL 2005에 도입 된 공통 테이블 식 (CTE)를 사용하는 것입니다

    가장 간단한 방법은 SQL 2005에 도입 된 공통 테이블 식 (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
    
  14. ==============================

    14.

    UPDATE tblAppraisalBasicData
    SET tblAppraisalBasicData.ISCbo=1
    FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID
    
  15. ==============================

    15.이 하나를 시도,이 뜻은 당신을 위해 작동 생각

    이 하나를 시도,이 뜻은 당신을 위해 작동 생각

    update ud
    
    set ud.assid = sale.assid
    
    from ud 
    
    Inner join sale on ud.id = sale.udid
    
    where sale.udid is not null
    
  16. ==============================

    16.SQLite는 대한 업데이트를 확인하기 위해 ROWID 속성을 사용 :

    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');
    
  17. from https://stackoverflow.com/questions/1293330/how-can-i-do-an-update-statement-with-join-in-sql-server by cc-by-sa and MIT license