私はms sqlserver 2005を使用しています。日付に従ってフィルタリングする必要があるクエリがあります。電話番号と日付を含むテーブルがあるとしましょう。時間枠 (開始日と終了日) 内の電話番号の数を指定する必要があります。この電話番号は、過去に表示された場合、結果カウントに含めるべきではありません。私はこのようなことをしています:
select (phoneNumber) from someTbl
where phoneNumber not in (select phoneNumber from someTbl where date<@startDate)
これは私にはまったく効率的ではないように見えます(また、プリフォームに時間がかかりすぎて、別の質問で提示する必要がある副作用が発生する可能性があります)、someTblにチェックする必要がある約300K行があります。
このチェックを行った後、もう 1 つチェックする必要があります。さらに 30,000 件の電話番号を含む過去のデータベースがあります。だから私は追加しています
and phoneNumber not in (select pastPhoneNumber from somePastTbl)
そして、それは本当に棺桶やラクダを壊す最後のストロー、または致命的な状態を説明するために使用しているフレーズを本当に釘付けにします。
だから私はこの2つのアクションを実行するためのより良い方法を探しています.
更新
私はアレクサンダーのソリューションを選択し、この種のクエリで終了しました:
SELECT t.number
FROM tbl t
WHERE t.Date > @startDate
--this is a filter for different customers
AND t.userId in (
SELECT UserId
FROM Customer INNER JOIN UserToCustomer ON Customer.customerId = UserToCustomer.CustomerId
Where customerName = @customer
)
--this is the filter for past number
AND NOT EXISTS (
SELECT 1
FROM pastTbl t2
WHERE t2.Numbers = t.number
)
-- this is the filter for checking if the number appeared in the table before startdate
AND NOT EXISTS (
SELECT *
FROM tbl t3
WHERE t3.Date<@startDate and t.number=t3.number
)
ありがとうギラッド