복붙노트

[SQL] 하위 쿼리와 SQL의 UPDATE 그 참조 MySQL은 같은 테이블

SQL

하위 쿼리와 SQL의 UPDATE 그 참조 MySQL은 같은 테이블

나는 UPDATE를 사용하여 테이블의 행 무리의 열 값을 업데이트하는 것을 시도하고있다. 문제는 내가이 칼럼에 대한 값을 도출하기 위해 하위 쿼리를 사용할 필요가있다, 그것은 같은 테이블에 따라 달라집니다. 다음 쿼리는 다음과 같습니다

UPDATE user_account student
SET student.student_education_facility_id = (
   SELECT teacher.education_facility_id
   FROM user_account teacher
   WHERE teacher.user_account_id = student.teacher_id AND teacher.user_type = 'ROLE_TEACHER'
)
WHERE student.user_type = 'ROLE_STUDENT';

교사와 학생이 개 서로 다른 테이블에 있던 보통하면, MySQL은 불평하지 않을 것이다. 그러나 그들은 모두 동일한 테이블을 사용하고 있기 때문에, 대신에이 오류 밖으로 MySQL의 결선 :

ERROR 1093 (HY000) : 당신은 FROM 절에서 업데이트 '학생'을 목표 테이블을 지정할 수 없습니다

업데이트를 할 내가 MySQL을 강제 할 수있는 방법이 있습니까? 나는 행이 업데이트로 100 % 긍정적이 절에서 영향을받지 않습니다입니다.

그렇지 않은 경우, 나는이 같은 영향을 달성하기 위해이 업데이트 SQL을 쓸 수있는 또 다른 방법은 무엇입니까?

감사!

편집 : 나는 일에 거 같아요 :

UPDATE user_account student
LEFT JOIN user_account teacher ON teacher.user_account_id = student.teacher_id
SET student.student_education_facility_id = teacher.education_facility_id
WHERE student.user_type = 'ROLE_STUDENT';

해결법

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

    1.당신을 위해 일부 참조 http://dev.mysql.com/doc/refman/5.0/en/update.html

    당신을 위해 일부 참조 http://dev.mysql.com/doc/refman/5.0/en/update.html

    UPDATE user_account student 
    INNER JOIN user_account teacher ON
       teacher.user_account_id = student.teacher_id 
       AND teacher.user_type = 'ROLE_TEACHER'
    SET student.student_education_facility_id = teacher.education_facility_id
    
  2. ==============================

    2.명확 테이블 및 열 이름을 가진 추상 예 :

    명확 테이블 및 열 이름을 가진 추상 예 :

    UPDATE tableName t1
    INNER JOIN tableName t2 ON t2.ref_column = t1.ref_column
    SET t1.column_to_update = t2.column_desired_value
    

    @Nico에 의해 제안

    이 도움말 사람을 바랍니다.

  3. ==============================

    3.

    UPDATE user_account 
    SET (student_education_facility_id) = ( 
        SELECT teacher.education_facility_id
        FROM user_account teacher
        WHERE teacher.user_account_id = teacher_id
        AND teacher.user_type = 'ROLE_TEACHER'
    )
    WHERE user_type = 'ROLE_STUDENT'
    

    위 샘플 업데이트 쿼리입니다 ...

    당신은 업데이트 SQL 문을 사용하여 하위 쿼리를 작성할 수 있으며, 해당 테이블에 대한 별명을 제공 할 필요가 없습니다. 서브 쿼리 테이블에 별칭 이름을 지정합니다. 나는 시도하고 나를 위해 잘 작동 것 ....

  4. ==============================

    4.

    UPDATE user_account student
    
    SET (student.student_education_facility_id) = (
    
       SELECT teacher.education_facility_id
    
       FROM user_account teacher
    
       WHERE teacher.user_account_id = student.teacher_id AND teacher.user_type = 'ROLE_TEACHER'
    
    )
    
    WHERE student.user_type = 'ROLE_STUDENT';
    
  5. ==============================

    5.나는 SQL 서버에 대해이 필요했습니다. 여기있어:

    나는 SQL 서버에 대해이 필요했습니다. 여기있어:

    UPDATE user_account 
    SET student_education_facility_id = cnt.education_facility_id
    from  (
       SELECT user_account_id,education_facility_id
       FROM user_account 
       WHERE user_type = 'ROLE_TEACHER'
    ) as cnt
    WHERE user_account.user_type = 'ROLE_STUDENT' and cnt.user_account_id = user_account.teacher_id
    

    나는 다른 RDBMS에서 (제발 확인)와 함께 작동합니다 생각합니다. 나는 구문처럼은 확장 때문입니다.

    필요한 포맷 사실이 있었다 :

    UPDATE table1 
    SET f1 = cnt.computed_column
    from  (
       SELECT id,computed_column --can be any complex subquery
       FROM table1
    ) as cnt
    WHERE cnt.id = table1.id
    
  6. ==============================

    6.

    UPDATE user_account student, (
       SELECT teacher.education_facility_id as teacherid
       FROM user_account teacher
       WHERE teacher.user_account_id = student.teacher_id AND teacher.user_type = 'ROLE_TEACHER'
    ) teach SET student.student_education_facility_id= teach.teacherid WHERE student.user_type = 'ROLE_STUDENT';
    
  7. from https://stackoverflow.com/questions/4268416/sql-update-with-sub-query-that-references-the-same-table-in-mysql by cc-by-sa and MIT license