SQL UPDATE SET 한 열이 다른 열에서 참조하는 관련 테이블의 값과 같도록 설정합니까?


112

이해가 되셨기를 바랍니다. 자세히 설명하겠습니다.

각 행에있는 퀴즈 프로그램에 대한 추적 데이터 테이블이 있습니다.

QuestionID 및 AnswerID (각각에 대한 테이블이 있습니다). 따라서 버그로 인해 많은 QuestionID가 NULL로 설정되었지만 관련 AnswerID의 QuestionID는 Answers 테이블에 있습니다.

따라서 QuestionID가 NULL이고 AnswerID가 500이라고 가정하면 Answers 테이블로 이동하여 AnswerID 500을 찾으면 NULL 값이 있어야하는 QuestionID가있는 열이 있습니다.

따라서 기본적으로 각 NULL QuestionID를 추적 테이블에있는 AnswerID의 Answer 행 (작성중인 NULL QuestionID와 동일한 행)에있는 Answers 테이블에있는 QuestionID와 동일하게 설정하고 싶습니다.

어떻게해야합니까?

UPDATE QuestionTrackings
SET QuestionID = (need some select query that will get the QuestionID from the AnswerID in this row)
WHERE QuestionID is NULL AND ... ?

일치하는 AnswerID에서 QuestionID를 QuestionID에 할당하는 방법을 모르겠습니다.


MySQL 및 Microsoft SQL Server는 각각 다중 테이블 UPDATE를 지원하기 위해 SQL 구문에 대한 확장을 지원합니다. 다른 브랜드는 그렇지 않습니다. 사용중인 데이터베이스 브랜드를 말하지 않았습니다.
Bill Karwin 2009

답변:


171
update q
set q.QuestionID = a.QuestionID
from QuestionTrackings q
inner join QuestionAnswers a
on q.AnswerID = a.AnswerID
where q.QuestionID is null -- and other conditions you might want

업데이트를 실행하기 전에 업데이트 할 결과 집합이 무엇인지 확인하는 것이 좋습니다 (선택 항목 만있는 동일한 쿼리).

select *
from QuestionTrackings q
inner join QuestionAnswers a
on q.AnswerID = a.AnswerID
where q.QuestionID is null -- and other conditions you might want

특히 각 답변 ID에 관련 질문 ID가 하나만 있는지 여부.


7
왜 그런지 모르겠지만 이것은 나를 위해 작동하지 않지만 이것은 작동합니다 : update QuestionTrackings q inner join QuestionAnswers a on q.AnswerID = a.AnswerID set q.QuestionID = a.QuestionID; 다른 순서로 동일한 기본 쿼리 인 것 같습니다. 왜 그런지 아세요?
billynoah

2
@billynoah, ORA-00971 : 오라클에서 실종 SET 키워드
비만

2
MySQL을 통해 PhpMyAdmin에서 유사한 상황에 문제가 있습니다. 필자의 경우 원본 및 대상 열은 동일한 테이블에 있지만 레코드 선택은 다른 테이블을 기반으로합니다. 쿼리 작품의 버전을 "선택"하지만 UPDTATE 문은 "FROM"에서 구문 오류가 발생합니다
2NinerRomeo

3
나는 더이처럼 보였다 "FROM"제거하여 내 문제를 통해 가지고 :UPDATE table1 NATURAL JOIN table2 SET table1.col1 = table1.col2 WHERE table2.col3 ="condition"
2NinerRomeo

대답의 "update q"에서 "q"는 리터럴 쿼리 매개 변수입니까 아니면 테이블 이름의 속기입니까?
Shawn

28

업데이트 및 가입 표기법이 없으면 (모든 DBMS에서 지원하는 것은 아님) 다음을 사용하십시오.

UPDATE QuestionTrackings
   SET QuestionID = (SELECT QuestionID
                        FROM AnswerTrackings
                        WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
   WHERE QuestionID IS NULL
     AND EXISTS(SELECT QuestionID
                        FROM AnswerTrackings
                        WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)

종종 이와 같은 쿼리에서 하위 쿼리를 포함하는 EXISTS 절로 WHERE 절을 한정해야합니다. 이렇게하면 UPDATE가 일치 항목이없는 행을 짓밟는 것을 방지합니다 (일반적으로 모든 값을 null 처리). 이 경우 질문 ID가 누락되면 NULL이 NULL로 변경되므로 문제가되지 않습니다.


이 방법은 Oracle 12c (update-join 방법이 실패한 경우)에서 저에게 효과적이었습니다.
shwartz

16

당신은 MySQL의 워크 벤치에 나보다 같은 문제로 실행 되었으나으로 쿼리를 실행 한 경우 나도 몰라 INNER JOIN애프터 FROM문이 나를 위해 일을하지 않았다. 프로그램이 FROM명령문 에 대해 불평했기 때문에 쿼리를 실행할 수 없습니다 .

그래서 쿼리 작업을 수행하기 위해 다음과 같이 변경했습니다.

UPDATE table1 INNER JOIN table2 on table1.column1 = table2.column1
SET table1.column2 = table2.column4
WHERE table1.column3 = 'randomCondition';

대신에

UPDATE a
FROM table1 a INNER JOIN table2 b on a.column1 = b.column1
SET a.column2 = b.column4
WHERE a.column3 = 'randomCondition';

내 솔루션이 MySQL에 적합한 구문이라고 생각합니다.


예, Mysql처럼 보입니다. JOIN은 쿼리의 'table_references'부분의 일부로 간주됩니다. MySQL 가입
AWP

12
UPDATE
    "QuestionTrackings"
SET
    "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID")
WHERE
    "QuestionID" is NULL
AND ...

1
나를 위해 오라클에서 일했습니다. @eglasius의 대답은 그렇지 않았습니다.
Lombas 2017 년

7

나는 같은 질문을하고 있었다. 다음은 eglasius와 유사한 작업 솔루션입니다. postgresql을 사용하고 있습니다.

UPDATE QuestionTrackings
SET QuestionID = a.QuestionID
FROM QuestionTrackings q, QuestionAnswers a
WHERE q.QuestionID IS NULL

1 행에서 테이블 이름 대신 q가 사용되었는지 불평하고 2 행에서 QuestionID 앞에 아무것도 없어야합니다.


3
 select p.post_title,m.meta_value sale_price ,n.meta_value   regular_price
    from  wp_postmeta m 
    inner join wp_postmeta n
      on m.post_id  = n.post_id
    inner join wp_posts p
      ON m.post_id=p.id 
    and m.meta_key = '_sale_price'
    and  n.meta_key = '_regular_price'
     AND p.post_type = 'product';



 update  wp_postmeta m 
inner join wp_postmeta n
  on m.post_id  = n.post_id
inner join wp_posts p
  ON m.post_id=p.id 
and m.meta_key = '_sale_price'
and  n.meta_key = '_regular_price'
 AND p.post_type = 'product'
 set m.meta_value = n.meta_value;

3

Mysql의 경우이 쿼리를 사용할 수 있습니다.

업데이트 table1 a, table2 b SET a.coloumn = b.coloumn WHERE a.id = b.id


1

첫 번째 테이블의 두 번째 테이블 데이터를 업데이트하려면 SET 전에 내부 조인해야합니다.

`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`;

1

아래는 mysql에서 작동합니다.

update table1 INNER JOIN table2 on table1.col1 =  table2.col1
set table1.col1 =  table2.col2

0

나는 이것이 효과가 있다고 생각한다.

UPDATE QuestionTrackings
SET QuestionID = (SELECT QuestionID
                  FROM AnswerTrackings
                  WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID)
WHERE QuestionID IS NULL
AND AnswerID IS NOT NULL;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.