2012-07-21 5 views
1

(My) SQL 쿼리에 몇 가지 문제가 있습니다. 내 DB에는 두 개의 테이블이 있습니다. 하나는 kfz_typen, 다른 하나는 kfz_temp2라고합니다. kfz_temp2 테이블의 모든 항목을 가져와야합니다. ktyp (정수 필드 만)는 kfz_typen 테이블에 없습니다.이 SQL 쿼리가 저에게 맞지 않는 이유는 무엇입니까?

SELECT * FROM kfz_temp2 
WHERE kfz_temp2.KType NOT IN (SELECT DISTINCT kfz_typen.ktyp FROM kfz_typen) 

내 의견으로는 위의 쿼리가 정확히 무엇을 원하는지 알아야합니다. 그러나 그렇지 않습니다! 난 그냥 내 MySQL 서버에서 다시 빈 결과를 얻을.

쿼리에 "NOT"이 없으면 두 테이블에있는 항목을 가져와 일치가 작동합니다.

그렇다면 위 쿼리의 문제점은 무엇입니까?

+0

'kfz_typen에서 고유 한 kfz_typen.ktyp을 선택하십시오'는 자체적으로 무엇을 반환합니까? – Simon

+0

@ 시몬 : 그것은 무엇을 반환, http://nopaste.info/644154e4a4.html –

+0

@ DimitriR .: : 다른 뭔가가 있어야합니다. [here] (http://sqlfiddle.com/#!2/4365d/1) –

답변

2

이 방법이 유용할까요?

SELECT t2.* FROM kfz_temp2 t2 
LEFT JOIN kfz_typen tn ON t2.KType = tn.ktyp 
WHERE tn.ktyp IS NULL 

결과를 그룹화해야 할 수 있습니다.

첫 번째 쿼리가 작동하지 않는 이유가 확실하지 않지만 동일한 문제가 있다고 생각합니다.

+0

이 왼쪽 조인은 kfz_typp.ktyp에서 NULL로 표시된 kfz_temp2와 관련이없는 튜플조차도 모든 kfz_typen 튜플을 반환하므로 동의합니다. – davidbuzatto

+0

예, 그게 나를 위해 일했습니다. 그러나 나는 아직도 이해하지 못한다. 왜 내 첫 번째 쿼리가 작동하지 않았는가. –

+0

첫 번째 질의 ('NOT IN'으로)은'kfz_typen.ktyp' 컬럼에'NULL'이 있다면 (심지어 하나라도) 0 행을 생성합니다. 이 유형의 쿼리를 작성하는 (의미 상) 올바른 방법 (anti-semijoins)은 'NOT EXISTS'또는 'LEFT JOIN/IS NULL'을 사용하는 것입니다 (이 응답과 유사). –

-2

별개의 것을 제거하고 나면 도움이되기를 바랍니다.

+0

중복은 IN 연산자에 영향을 미치지 않으므로 DISTINCT 키워드를 제거해도 아무 효과가 없습니다. –

관련 문제