2013-01-17 9 views
1

에서 참조하는 테이블을 업데이트합니다. 스키마를 제어 할 수없는 불완전한 데이터베이스를 수정하려고하는데 누락 된 항목을 찾아서 삽입해야합니다.하위 쿼리 결과를 사용하여 하위 쿼리

이것은 내가에 도착했습니다 구문입니다

INSERT INTO 
    downloads (product_id, filename) 
VALUES 
( 
    products_id = (SELECT id 
     FROM products 
     WHERE id NOT IN 
      (SELECT product_id 
      FROM downloads 
      ) 
     ), 
    filename = 'default.zip' 
) 

하위 쿼리 혼자 잘 작동하지만 위의 난이 관련된 StackOverflow의 질문의 많은 검토 한

#1093 - You can't specify target table 'download' for update in FROM clause 

오류가 발생합니다 오류 (like this) 및 "creates an implicit temporary table, so it doesn't count as the same table you're updating"하위 쿼리를 중첩 할 수있는 방법이 있지만 그 적응할 수없는 것을 수집합니다.

내 접근 방식이 비효율적이라면 괜찮습니다. 제 문법에 가깝지만 어떤 솔루션이 도움이 될지 궁금합니다. 할

답변

2

것,

  • 사용 INSERT...INTO SELECTLEFT JOIN 대신 NOT IN의이
  • 이 컬럼에 인덱스를 추가하는 것을 잊지 마세요
  • 사용 : products.IDdownloads.product_id을 더 빠른 성능을

검색어,

INSERT INTO downloads (product_id, filename) 
SELECT a.id AS product_id, 'default.zip' AS filename 
FROM products a 
     LEFT JOIN downloads b 
      ON a.ID = b.product_id 
WHERE b.product_id IS NULL 
+0

매력처럼 작동했습니다. 'IS NULL '의 의미에 대한 이해가 부족하여 중첩 된 서브 쿼리 솔루션으로 이어진다. –