質問

私は何百万回もやったことをやろうとしていますが、うまくいきません。誰か理由を教えてもらえますか?

履歴書を送った人用のテーブルがあり、その中にメール アドレスが記載されています。

この中に Web サイトに登録していない人がいるかどうかを知りたいのです。aspnet_Membership テーブルには、Web サイトにサインアップしているすべてのユーザーが含まれます。

9,472 人の求職者が独自の電子メール アドレスを持っています。

このクエリでは 1793 件の結果が生成されます。

select j.email from jobseeker j
join aspnet_Membership m on j.email = m.email

これは、Web サイトに登録していない人の電子メールが 7,679 (9472 ~ 1793) 件あるはずであることを示唆しています。そのうち 1793 個が一致したので、残りは一致しないと予想されます...しかし、それに対してクエリを実行しても何も得られません。

このクエリでは何も得られないのはなぜですか?

select j.email 
from jobseeker j
where j.email not in (select email from aspnet_Membership)

それがどのように機能しないのかわかりません。基本的には、「jobseeker テーブルにあるが、aspnet_Membership テーブルにない電子メールをすべて表示します...」と言います。

役に立ちましたか?

解決

最近、サブクエリが時々 null 値を返すという、非常に似た問題が発生しました。次に、 in ステートメントは null を奇妙な方法で処理します。常に値と一致すると思うので、クエリを次のように変更すると、

select j.email 
from jobseeker j
where j.email not in (select email from aspnet_Membership
                      where email is not null)

それはうまくいくかもしれません....

他のヒント

重複したものが大量に存在する可能性があります。クエリエラーが頭から離れたわけではありませんが、次のように書いてみてください。

SELECT j.email
FROM jobseeker j
LEFT JOIN aspnet_Membership m ON m.email = j.email
WHERE m.email IS NULL

GROUP BY または DISTINCT をそこにスローして重複を取り除くこともできます。

使用できます exists の代わりに in このような:

Select J.Email
From Jobseeker j
Where not exists (Select * From aspnetMembership a where j.email = a.email)

を使用すると、パフォーマンスが向上し、「奇妙な」動作(null 値/結果を使用した場合に起こると思われます)を回避する必要があります。 in.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top