2013-05-10 1 views
1

매우 복잡한 쿼리가 발생합니다. 내가 가지고있는 것은 자동차 부품 (parts_list, 약 600 행)이있는 테이블입니다.이 테이블에는 이름과 모터 의존성 여부와 같은 부품에 대한 정보가 포함되어 있습니다. 모터 종속성에 대해 나는 두 개의 서로 다른 질의를 가지므로, 이것은 모터 의존성이없는 것이다 (0, 나는 그것을 부울로 저장한다). 대부분의 부품을 분해하고 더 많은 부품으로 분해 할 수 있습니다. 그 이유는 부품을 나무로 저장하는 것이고 그 쿼리에서는 분해 할 수없는 부품 (나무 잎)만을 사용하기 때문입니다. 이 표는 가능한 부분의 목록 만 나타냅니다. 이제 각 자동차 모델에 대해 행을 다른 테이블 (부품)에 저장하고 part_list_id와 model_id를 함께 쓴 다음 가격과 수량을 셉니다. 이제 내가 쿼리를 실행하면 테이블 "파트"에서 약 500 개의 행 (리프 부분 만 사용)을 성공적으로 생성하여 필요한 작업을 수행합니다. 모델 ID는 약 500 (잎) 부분입니다. 그러나 때로는 특정 부품에 대한 다른 모델 행을 생성합니다. 그리고 쿼리는 나머지 499 행을 만들지 않습니다. WHERE NOT EXISTS select 쿼리가 0을 돌려주는 경우에만 작동합니다. 한 행이라도 존재하면 나머지를 삽입하지 않습니다. 그러나 루프와 같은 다른 값으로 검사해서는 안되기 때문에 그것은 나에게 이해가되지 않습니까?MySQL 삽입 하나의 행이 있어도 쿼리가 삽입되지 않는 곳

INSERT INTO parts (parts_list_id, model_id, motor_id) 
SELECT  orig1.id, '" . $this->model_id . "', '0' 
FROM  parts_list AS orig1 
LEFT JOIN parts_list AS orig2 ON (orig1.id = orig2.parent_id) 
WHERE  orig2.id IS NULL 
AND   orig1.motor_dependent = '0' 
AND NOT EXISTS (
    SELECT  t1.id 
    FROM  parts_list AS t1 
    LEFT JOIN parts_list AS t2 ON (t1.id = t2.parent_id) 
    LEFT JOIN parts ON (parts.parts_list_id = t1.id) 
    WHERE  t2.id IS NULL 
    AND   t1.motor_dependent = '0' 
    AND   parts.parts_list_id = t1.id 
    AND   parts.model_id = :model_id 
) 

답변

0

글쎄, SQL 문은 괜찮아 보입니다. 한 행이 있으면 NOT EXISTS가 false를 반환합니다. 그리고 그것은 맞습니다. 아무 행도 삽입되지 않습니다. 아마도 NOT EXISTS 대신에 parts_list_id NOT IN (서브 쿼리)을 사용하여 다른 검사를하고 싶을 것입니다.

NOT EXISTS는 집합 전체에 대한 조건을 나타내며 NOT IN은 집합에 올바른 항목이 있는지 결정하는 데 사용됩니다.

나는 그것을 올바르게 얻길 바랍니다. 한 문장으로 도메인을 이해하는 것은 약간 어렵습니다.

+0

감사합니다. NOT EXIST가 모든 행에 대해 전역이라는 것을 알았습니다. 나는 WHERE NOT EXISTS 절의 하위 쿼리와 SELECT 쿼리의 하위 ID에서 모두 두 ID를 잠그는 방식으로 작업했습니다. 그러나 어쨌든 나는 적당한 키워드를 사용하지 않고있다. NOT IN은 사용해야하는 것입니다. – Tony

+0

좋은 하루 되세요. – gpicchiarelli