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

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

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

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에 할당하는 방법을 모르겠습니다.



답변

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가 하나만 있는지 여부.


답변

업데이트 및 가입 표기법이 없으면 (모든 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로 변경되므로 문제가되지 않습니다.


답변

당신은 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에 적합한 구문이라고 생각합니다.


답변

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


답변

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

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

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


답변

 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;


답변

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

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