2017-12-12 3 views
-1

PostgreSQL에서이 쿼리를 실행하여 customer 테이블에 있지만 상태는 _customer 테이블에 없습니다. 나는이 경우 쿠알라 룸푸르가 실종되었다는 것을 안다. (기술적으로는 국가가 아니다.) 그러나 쿼리는 아무 것도 반환하지 않습니다.하위 쿼리가 올바른 결과를 반환하지 않음

SELECT DISTINCT ("Billing Address State") 
FROM customer 
WHERE "Billing Address State" NOT IN (
    SELECT DISTINCT("Billing Address State") 
    FROM _customer 
); 

다른 쿼리 : 원래 쿼리의

SELECT DISTINCT ("Billing Address State") 
FROM customer 

NT 
South Australia 
Kuala Lumpur 
Hertfordshire 
NSW 
Bangkok 
West Java 
Queensland 
New South Wales 
Western Australia 
Stockholm 
Victoria 
WA 
QLD 
Gauteng 
Australian Capital Territory 
SA 
Other 
TAS 
Northern Territory 
VIC 
Rhondda Cynon Taf 
Tasmania 
ACT 
Îles du Vent 
North Lanarkshire 
Norfolk 
Dublin 

그리고

SELECT DISTINCT("Billing Address State") 
FROM _customer; 

NT 
South Australia 
Hertfordshire 
NSW 
Bangkok 
West Java 
Queensland 
New South Wales 
Western Australia 
Stockholm 
Victoria 
ACT 
Îles du Vent 
WA 
North Lanarkshire 
Norfolk 
Dublin 
QLD 
Gauteng 
Australian Capital Territory 
SA 
Other 
TAS 
Northern Territory 
VIC 
Rhondda Cynon Taf 
Tasmania 

보완 : 쿠알라 룸푸르 제외

SELECT DISTINCT ("Billing Address State") 
FROM customer 
WHERE "Billing Address State" IN (
    SELECT DISTINCT("Billing Address State") 
    FROM _customer 
); 

반환 다. 다른 말로하면, 쿠알라 룸푸르는 _customer에 있으며 동시에 존재하지 않습니다.

+1

_Customer에서 "Billing Address State"가 null 일 수 있습니까? 그것은 적어도 하나의 요소가 null 일 때 'NOT IN'이 아무 것도 반환하지 않기 때문에 설명 할 것입니다. –

+0

예! 그게 문제였습니다 – lfk

+1

중간에 'IN'또는 'NOT IN'과 함께'DISTINCT '를 사용하지 마십시오. DBMS에게 당신이 관심있는 데이터 (여기에있는 다른 테이블에없는 고객)를 알려주고 그것을 달성하는 방법을 알려주지 않아야합니다. DBMS에 그대로 두십시오. DISTINCT 연산을 수행할지 여부를 최적으로 결정합니다. –

답변

2

NOT IN의 적어도 하나의 요소가 null 인 경우 쿼리는 아무 것도 반환하지 않습니다. 논증은 목록의 값 중 하나가

SELECT DISTINCT ("Billing Address State") 
FROM customer 
WHERE "Billing Address State" NOT IN (
    SELECT "Billing Address State" 
    FROM _customer 
    WHERE "Billing Address State" IS NOT NULL 
); 
3

NOT IN도 :-) DBMS에 값을 알 수없는이 때 DBMS가 값이 목록에없는 것을 보장 할 수 없습니다 다소 까다된다 때 하위 쿼리 @Thorsten Kettner가 이미 설명했듯이 null 값을 반환합니다. 난 항상로 전환하는 것이 좋습니다 "널 (null)을 안전"NOT EXISTS 대신 :

SELECT DISTINCT "Billing Address State" 
FROM customer c1 
WHERE NOT EXISTS (
    SELECT * 
    FROM _customer c2 
    WHERE c2."Billing Address State" = c1."Billing Address State"); 

또는,이 경우 당신은 단순히 EXCEPT를 사용할 수 있습니다

당신은 또한 왼쪽으로 갈 수
SELECT "Billing Address State" 
FROM customer 
EXCEPT 
SELECT "Billing Address State" 
FROM _customer 
+0

'EXISTS'가 훨씬 느리지 않습니까? – lfk

+0

@Farshid, 무엇보다 느린가요? 나는 그 질문에 대답하기에 충분할만큼 Postgresql을 모른다. 보십시오! – jarlh

0

가입 :

SELECT DISTINCT "Billing Address State" 
FROM customer c1 
LEFT JOIN _customer c2 ON c2."Billing Address State" = c1."Billing Address State" 
WHERE c2.<whatever> IS NULL; 
+0

'c2. '은 null이 아닌 열이어야합니다. – jarlh

관련 문제