select .. in(..)の代替
-
27-10-2019 - |
質問
私は3つの列を備えたテーブルを持っています:(人の)、都市(人が訪れた)、日付(彼の訪問の)。特定の日付の間にシティロサンゼルスにいたすべての人々(彼らのID)を選択する必要があります。
これが私が今実行しているクエリの例です:
SELECT DISTINCT id
FROM places
WHERE date >= '2011-03-18' AND
date < '2011-03-19' AND
city = 'los angeles' AND
id IN (SELECT DISTINCT id
FROM places
WHERE date >= '2011-03-15' AND
date < '2011-03-16' AND
city = 'chicago'
GROUP BY id);
私もできることはありますか?私が使用できる他のクエリはありますか?この選択は遅すぎます。
解決
サブクエリの代わりに(エイリアス付き)結合を使用する必要があります。
SELECT places.id
FROM places
JOIN places AS places2 ON places2.id = places.id
AND places2.date >= '2011-03-15'
AND places2.date < '2011-03-16'
AND places2.city = 'chicago'
WHERE places.date >= '2011-03-18'
AND places.date < '2011-03-19'
AND places.city = 'los angeles'
GROUP BY places.id;
他のヒント
まず、関連するインデックスが整っていることを確認する必要があります。この場合、おそらく2つの列の日付と都市を持つ1つのインデックスです。その後、クエリを取り、パフォーマンスをここで提案するクエリと比較できます。内側の結合は、あなたがすでに持っているものよりも速いかもしれません。
私のバージョンはSQL Serverで機能します。私も他のDBMSで働くかもしれません。
select id
from places
where [date] >= '2011-03-18' AND
[date] < '2011-03-19' AND
city = 'los angeles'
intersect
select id
from places
where [date] >= '2011-03-15' AND
[date] < '2011-03-16' AND
city = 'chicago';
SELECT id
FROM places AS p1
INNER JOIN AS p2 ON p1.id = p2.id AND p2.date >= '2011-03-15' AND p2.date < '2011-03-19'
AND p2.city = 'chicago'
WHERE p1.date >= '2011-03-18' AND p1.date < '2011-03-19' AND p1.city = 'los angelis'
内側の結合を試してください
SELECT DISTINCT p1.id
FROM places p1
INNER JOIN places p2 ON p1.id = p2.id AND
p2.date >= '2011-03-18' AND
p2.date < '2011-03-19' AND
p2.city = 'los angeles'
WHERE p1.date >= '2011-03-18' AND
p1.date < '2011-03-19' AND
p1.city = 'los angeles' AND
テーブルのインデックスを確認し、都市と日付に何かがあるかどうかを確認します。
所属していません StackOverflow