2016-05-13 49 views
-1

我有一种情况,我需要从特定站点的MEMBERS表中选择前景('P'关系)。但是,当我选择这些人时,我需要排除两组这些潜在客户。这些组中的每个组在名为MEMBERUDFS的单独表中都有条目。现在,MEMBERS表中的所有条目都不会在MEMBERUDFS表中具有条目。因此,我试图通过使用两个“NOT IN”子查询从主查询中排除这些组,但似乎不起作用。我可以用下面的查询排除组隔离:SQL不在子查询

SELECT MEMBERS_1.memid 
FROM MEMBERS AS MEMBERS_1 
JOIN SITES AS SITES_1 ON MEMBERS_1.siteid = SITES_1.siteid 
LEFT JOIN MEMBERUDFS AS MEMBERUDFS_1 ON MEMBERS_1.memid = MEMBERUDFS_1.memid 
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) 

而且这个查询:

SELECT MEMBERS_2.memid 
FROM MEMBERS AS MEMBERS_2 
JOIN SITES AS SITES_2 ON MEMBERS_2.siteid = SITES_2.siteid 
LEFT JOIN MEMBERUDFS AS MEMBERUDFS_2 ON MEMBERS_2.memid = MEMBERUDFS_2.memid 
JOIN MEMBERUDFSETUPS AS MEMBERUDFSETUPS_2 ON MEMBERUDFS_2.udfid = MEMBERUDFSETUPS_2.udfid 
WHERE (MEMBERS_2.relationship = 'P') 
    AND (MEMBERS_2.email <> '') 
    AND (MEMBERUDFS_2.udfid = '25') 
    AND (MEMBERUDFS_2.udfvalue = 'Yes') 
    AND (MEMBERS_2.entrydate < DATEADD(DAY, -21, GETDATE())) 
    AND (MEMBERS_2.siteid = @rvSite) 

所以这是我不得不放在一起,但它并没有消除两个SUBQUERY组:

SELECT MEMBERS.scancode, 
     MEMBERS.memid, 
     MEMBERS.fname, 
     MEMBERS.lname, 
     MEMBERS.relationship, 
     MEMBERS.status, 
     MEMBERS.email, 
     MEMBERS.entrydate, 
     SITES.sitename 
FROM MEMBERS 
JOIN SITES ON MEMBERS.siteid = SITES.siteid 
WHERE (MEMBERS.relationship = 'P') 
    AND (MEMBERS.email <> '') 
    AND (MEMBERS.siteid = @rvSite) 
    AND (MEMBERS.memid NOT IN (
     SELECT MEMBERS_1.memid 
     FROM MEMBERS AS MEMBERS_1 
     JOIN SITES AS SITES_1 ON MEMBERS_1.siteid = SITES_1.siteid 
     LEFT JOIN MEMBERUDFS AS MEMBERUDFS_1 ON MEMBERS_1.memid = MEMBERUDFS_1.memid 
     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.memid NOT IN (
     SELECT MEMBERS_2.memid 
     FROM MEMBERS AS MEMBERS_2 
     JOIN SITES AS SITES_2 ON MEMBERS_2.siteid = SITES_2.siteid 
     LEFT JOIN MEMBERUDFS AS MEMBERUDFS_2 ON MEMBERS_2.memid = MEMBERUDFS_2.memid 
     JOIN MEMBERUDFSETUPS AS MEMBERUDFSETUPS_2 ON MEMBERUDFS_2.udfid = MEMBERUDFSETUPS_2.udfid 
     WHERE (MEMBERS_2.relationship = 'P') 
      AND (MEMBERS_2.email <> '') 
      AND (MEMBERUDFS_2.udfid = '25') 
      AND (MEMBERUDFS_2.udfvalue = 'Yes') 
      AND (MEMBERS_2.entrydate < DATEADD(DAY, -21, GETDATE())) 
      AND (MEMBERS_2.siteid = @rvSite)) 
    ) 

任何帮助,将不胜感激

+2

你确实需要使用Code Formatter。你有你的SQL的方式 - 这是一个混乱的混乱。 – Leptonator

+1

考虑处理缩进。另外,我们需要知道实际问题和期望的输出。你的表格的一些示例行会很好。 – Sturgus

+0

您可能需要[Left Excluding JOIN]的一些变体(http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins) –

回答

0

你只需要你的wher玩e条款...

AND (MEMBERS.memid NOT IN (
    SELECT MEMBERS_1.memid 
    FROM MEMBERS AS MEMBERS_1 
    JOIN SITES AS SITES_1 ON MEMBERS_1.siteid = SITES_1.siteid 
    LEFT JOIN MEMBERUDFS AS MEMBERUDFS_1 ON MEMBERS_1.memid = MEMBERUDFS_1.memid 
    JOIN MEMBERUDFSETUPS AS MEMBERUDFSETUPS_1 ON MEMBERUDFS_1.udfid = MEMBERUDFSETUPS_1.udfid 
    WHERE (MEMBERS_1.relationship = 'P') 
     AND (MEMBERS_1.email <> '') 
     AND (MEMBERS_1.siteid = @rvSite) 
     AND (((MEMBERUDFS_1.udfid = '26') AND (MEMBERUDFS_1.udfvalue = 'No') AND (MEMBERS_1.entrydate < DATEADD(DAY, -6, GETDATE()))) OR 
      ((MEMBERUDFS_1.udfid = '25') AND (MEMBERUDFS_1.udfvalue = 'Yes') AND (MEMBERS_1.entrydate < DATEADD(DAY, -21, GETDATE()))))