לפני זמן קצר נוכחתי לדעת כי רבים וטובים מהעוסקים בשליפת מידע הן באמצעות כתיבת SQL והן באמצעות כלים אוטומטים מבצעים טעות קריטית אשר גורמת למידע שגוי.
כדי להסביר את הטעות, ניקח מודל פשוט: טבלת מכירות וטבלת סוכנים כמתואר בטבלה הבאה:
אם נשאל את השאלה הבאה: מי הם הסוכנים אשר מכרו את מוצר B, השאילתא לכך היא פשוטה וברורה:
וכמובן שהתשובה היא John וGeorge.
הבעיה היא בשאלה ההפוכה: מי הם הסוכנים אשר לא מכרו את מוצר B. השאילתא לכך טומנת בחובה מוקש. למראית עין, אם נשתמש באופרטור "שונה מ" (יכול להופיע כdifferent או != תלוי בDB ) נקבל תשובה נכונה:
אך למעשה נקבל תשובה שגויה. הסיבה לכך נעוצה בעובדה שהיחס בין הטבלאות הוא יחס של אחד לרבים ובמקרה זה, המשמעות של "שונה מ" היא "אלה שיש להם משהו השונה מ". לכן כתוצאה משימוש באופרטור זה אנו נקבל גם את סוכן john משום שמכר מוצר השונה מB (לדוגמא A,C) בעוד שהינו מעוניינים להשמיטו (מכר מוצר B)
אך מנגד סוכן George יושמט מהרשימה ובצדק משום שהיחס במקרה שלו הוא אחד לאחד (לא מכר מוצר נוסף למעט B)
אם כך, איך נוכל לשלוף את הסוכנים אשר לא מכרו מוצר B? לצורך זה נשתמש בחבר ותיק שבו השתמשנו בעבר: Exists
תזכורת: exists(שאילתא) מחזיר true כאשר השאילתא מחזירה ערך וfalse אחרת.
אם נשתמש בשאילתא כזאת:
נקבל תשובה חלקית, אלה שלא מכרו B בכלל ברמת טבלת sales. כלומר מספיק שסוכן כלשהו מכר B והexists יגרום לשמיטת כל הרשומות והשאילתא תחזיר 0 רשומות .אנו נצטרך לשכלל את השאילתא ולבדוק ברמה של סוכן:
שימו לב לחיבור של הסוכנים מהשאילתא הפנימית של הexists לבין השאילתא החיצונית . הערה: ה1 המופיע בשאילתות הפנימיות הוא ערך שרירותי לחלוטין ואפשר במקומו לבחור כל ערך אחר
עכשיו קיבלנו את רשימת הסוכנים אשר לא מכרו את מוצר B!