العثور على المفقودين رسائل البريد الإلكتروني في SQL Server
سؤال
أنا أحاول أن أفعل شيئا فعلته من مليون مرة و هو لا يعمل, هل يمكن لأحد أن يقول لي لماذا ؟
لدي جدول للأشخاص الذين أرسلت في السير الذاتية ، ولها عنوان البريد الإلكتروني الخاصة بهم في ذلك...
أريد معرفة ما إذا كان أي من هؤلاء الناس لم توقع على موقع ويب.على aspnet_Membership الجدول يحتوي على جميع الناس الذين سجلوا على الموقع.
هناك 9472 الباحثين عن عمل من عناوين البريد الإلكتروني.
هذا الاستعلام تنتج 1793 النتائج:
select j.email from jobseeker j
join aspnet_Membership m on j.email = m.email
هذا يشير إلى أنه ينبغي أن يكون هناك 7679 (9472-1793) رسائل البريد الإلكتروني من الناس الذين ليسوا وقعت على موقع ويب.منذ عام 1793 منهم لم تطابق ، أتوقع البقية لا تتطابق مع...ولكن عندما أفعل الاستعلام من أجل أن أحصل على أي شيء!
لماذا هذا الاستعلام تعطيني شيئا؟??
select j.email
from jobseeker j
where j.email not in (select email from aspnet_Membership)
أنا لا أعرف كيف يمكن أن لا يعمل - تقول في الأساس "تظهر لي جميع رسائل البريد الإلكتروني التي يتم الباحثين عن عمل في الجدول, ولكن ليس في aspnet_Membership الجدول...
المحلول
لدينا مشكلة مماثلة في الآونة الأخيرة حيث الاستعلام الفرعي كان عائدا قيم فارغة في بعض الأحيان.ثم في بيان يعامل 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
يمكنك أيضا رمي مجموعة أو متميزة في التخلص من التكرارات.
هل يمكن استخدام exists
بدلا من in
مثل هذا:
Select J.Email
From Jobseeker j
Where not exists (Select * From aspnetMembership a where j.email = a.email)
يجب أن تحصل على أداء أفضل وتجنب 'غريب' السلوك (وأظن أن تفعل مع القيم null/النتائج) عند استخدام in
.