Koristis outer joine kako ne treba.
1. joini na role moraju da budu inner (many to many zahteva dva inner joina). U suprotnom ces dobiti lazne matcheve u kojima ce kljucevi biti NULL.
2. right outer na membership treba da bude inner. right outer koristis kad hoces da svi redovi iz membership ulaze u join cak iako kljuc ne postoji u user, sto je ovde nemoguce jer je relacija one-to-zero/one. koristi innerjoin
3. membership na registrant treba isto da bude inner jer te ne interesuju oni koji nimaju registraciju sa receiveNewsletter
4. Kad poredis bit boolean polje, koristi <>0 umesto =1. Brze je malo a i ne zavisis od interpretacije servera (da li je true = -1 ili 1)
Code:
SELECT m.email
FROM aspnet_users u
INNER JOIN aspnet_usersInRoles uir ON u.userId = uir.userID
INNER JOIN aspnet_roles r ON r.roleID = uir.roleID
INNER JOIN aspnet_membership m ON u.userID = m.userID
INNER JOIN aspnet_custom_registrants cr ON m.userID = cr.userID
WHERE cr.receiveNewsletter <> 0 AND r.roleName = 'user'
ako ti ni ovo ne vraca rezultat onda nemas korisnika sa uslovima koje si naveo, sto pre mislim da ce biti slucaj. Iako neoptimizovan, tvoj script bi trebao da radi ok zato sto te dve where klauzule ispeglaju tvoja dva outer joina u efektivne inner join-e. Probaj ovaj skript pa javi.
▪ The quicker a phone is answered in sales, the slower it's answered in customer services - Brownridge's Law
▪ Democracy is a device that ensures we shall be governed no better than we deserve - George Bernard Shaw
▪ To err is human--and to blame it on a computer is even more so - Robert Orben