동일한 테이블을 기반으로하는 UPDATE 테이블


12

제품 설명이 포함 된 표가 있으며 각 제품 설명에는 a product_id및 a가 language_id있습니다. 내가하고 싶은 것은 함께 모든 필드를 업데이트 인 language_id의이 2같은 동일하게 product_id(가) 곳 language_id이다 1.

지금까지 다음 쿼리를 시도했지만 MySQL이 테이블이 하위 쿼리에서도 사용되는 테이블을 업데이트하고 싶지 않다는 오류가 발생합니다.

UPDATE
  products_description AS pd
SET 
  pd.products_seo = (
    SELECT
      pd2.products_seo
    FROM 
      products_description AS pd2
    WHERE
        pd2.language_id = 1
    AND pd2.products_id = pd.products_id
  )
WHERE
  pd.language_id <> 1

MySQL에서이 한계를 극복하는 "간단한"방법이 있습니까? 아니면 어떤 "트릭"? 논리적으로 보이므로 내 쿼리가 작동하지 않는다는 것에 약간 놀랐습니다.

답변:


19

이것은 오히려 위험한 사업이며 이유를 이해할 수 있습니다. MySQL이 하위 쿼리를 처리하는 방식과 관련이 있습니다. 2011 년 2 월 22 일에 다시 작성했습니다 : MySQL 하위 쿼리 문제

SELECT 및 하위 쿼리 SELECT를 포함하는 JOIN 수행은 정상입니다. 반면에 UPDATEs와 DELETE는 다소 죽음을 이끄는 모험이 될 수 있습니다.

암시

두 테이블의 INNER JOIN이되도록 쿼리를 리팩토링하십시오.

UPDATE
    products_description pd INNER JOIN products_description pd2 ON
    (pd.products_id=pd2.products_id AND pd2.language_id=1 AND pd.language_id<>1)
SET pd.products_seo = pd2.products_seo;

시도 해봐 !!!


0

글쎄, 이것은 나를 위해 작동하지 않았다, 일치하는 행이 있었지만 업데이트가 발생하지 않았습니다. 내가해야 할 일은 임시 테이블이 사용되도록 다른 테이블을 하위 쿼리로 만드는 것입니다.

UPDATE tmContact 
INNER JOIN (
SELECT par.id, IF (LENGTH(contact.dynamicValues) > LENGTH(par.dynamicValues), contact.dynamicValues, par.dynamicValues) upd FROM tmContact par
INNER JOIN tmContact contact ON par.id = contact.linkCompanyId AND contact.linkCompanyId IS NOT NULL
WHERE contact.id IS NOT NULL AND contact.dynamicValues <>  par.dynamicValues AND LENGTH(contact.dynamicValues) > LENGTH(par.dynamicValues)
) input ON input.id = tmContact.id
SET tmContact.dynamicValues = upd;

-3
  1. 먼저 select 문으로 view / temp 테이블을 만듭니다.
  2. 내부 조인으로 업데이트 쿼리 실행

2
아마도 샘플 코드로 답변을 향상시킬 수 있습니까?
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.