2017-12-12 6 views
-1

PostgreSQLでこのクエリを実行して、customerテーブルにあり、_customerテーブルに存在しない状態を確認しています。この場合、クアラルンプールは紛失していることがわかります(技術的には国家ではありません)。しかし、クエリは何も返さない。サブクエリーでNOTが正しい結果を返していません

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で「請求先住所の状態」をnullにすることはできますか?少なくとも1つの要素がnullのとき、 'NOT IN'は何も返しません。 –

+0

はい!それは問題だった – lfk

+1

途中で 'IN'または' NOT IN'で 'DISTINCT'を使わないでください。興味のあるデータ(ここでは他のテーブルにない顧客)をDBMSに伝え、それを達成する方法ではありません。それをDBMSに任せてください。 DISTINCT操作を実行するか否かを最適に実行するかどうかを決定します。 –

答えて

2

NOT INの少なくとも1つの要素が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値を返します。私はいつもの代わりに「ヌル・安全」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

関連する問題