У меня есть ситуация, когда мне нужно извлечь записи участников из таблицы «ЧЛЕН». Мне нужно получить фамилию, имя, отношения, имя входа, идентификатор участника, адрес электронной почты и идентификатор сайта. Критерии - это отношение «P», siteid «111» и непустой адрес электронной почты. И мне нужно исключить два подмножества. Подмножество A имеет все вышеперечисленные критерии плюс поле, определяемое пользователем, с идентификатором пользователя, определяющим поле 26, значением поля, определяемым пользователем, «Нет» и датой ввода более 6 дней назад. Подмножество B имеет одни и те же основные критерии, но дату ввода более 2 недель назад и поле, определяемое пользователем, 25 и используемое определенное значение поля 25. Поля и значения, определенные пользователем, хранятся в отдельной таблице (MEMBERUDFS) из Данные участников. Сложная часть - если пользователь не установил значение поля, определенного пользователем, в таблице MEMBERUDFS нет записи. Две таблицы связаны с ключом memid.SQL Exclude через подзапрос
Это то, что у меня есть до сих пор, и это не исключает группу A, и я не пытался добавить логику, чтобы исключить группу B. Любая помощь будет принята с благодарностью !!! :
SELECT MEMBERS.scancode,
MEMBERS.memid,
MEMBERS.fname,
MEMBERS.lname,
MEMBERS.relationship,
MEMBERS.STATUS,
MEMBERS.email,
MEMBERS.entrydate,
SITES.sitename
FROM MEMBERS
INNER JOIN SITES ON MEMBERS.siteid = SITES.siteid
LEFT OUTER JOIN MEMBERUDFS ON MEMBERS.memid = MEMBERUDFS.memid
INNER JOIN MEMBERUDFSETUPS ON MEMBERUDFS.udfid = MEMBERUDFSETUPS.udfid
WHERE (MEMBERS.relationship = 'P')
AND (MEMBERS.email <> '')
AND (
MEMBERS.memid NOT IN (
SELECT MEMBERS_1.memid
FROM MEMBERS AS MEMBERS_1
INNER JOIN SITES AS SITES_1 ON MEMBERS_1.siteid = SITES_1.siteid
LEFT OUTER JOIN MEMBERUDFS AS MEMBERUDFS_1 ON MEMBERS_1.memid = MEMBERUDFS_1.memid
INNER JOIN MEMBERUDFSETUPS AS MEMBERUDFSETUPS_1 ON MEMBERUDFS_1.udfid = MEMBERUDFSETUPS_1.udfid
WHERE (MEMBERS_1.relationship = 'P')
AND (MEMBERS_1.email <> '')
AND (MEMBERUDFS_1.udfid = '26')
AND (MEMBERUDFS_1.udfvalue = 'No')
AND (MEMBERS_1.entrydate < DATEADD(DAY, 6, GETDATE()))
AND (MEMBERS_1.siteid = @rvSite)
)
)
AND (MEMBERS.siteid = @rvSite)
Можете привести пример строки данных, которую вы пытаетесь исключить, которая не исключается вашим текущим запросом? На первый взгляд это выглядит нормально. –
memid, lname, fname, relationship, email, entrydate, siteid будет 1234, Doe, John, P, [email protected], 04-15-2016 00: 00: 00: 00, 111, где UDF из 26 значение «Нет» – Merlin
В вашем подзапросе вы используете левое соединение с MEMBERUDFS, но тогда у вас также есть предикаты, ссылающиеся на эту таблицу. Этот шаблон фактически превращает это левое соединение во внутреннее соединение. –