如何比较两个表并删除匹配的字段(不匹配记录)

时间:2009-03-18 23:15:13

标签: sql sql-server duplicates

情景:需要对20,000名成员进行抽样调查。调查样本量为20000名成员中的3500名。所有会员都在表tblMember。上一年进行了同样的调查,被调查的成员都在tblSurvey08。会员数据可能会在一年内发生变化(例如新的电子邮件地址等),但会员ID数据保持不变。

如何从tblMember中删除包含tblSurvey08的MemberID /记录,以创建要调查的潜在成员的新表(让我们称之为tblPotentialSurvey09)。同样,单个成员的记录可能与不同的表不匹配,但MemberID字段将保持不变。

我对这个东西相当新,但我似乎遇到了一个问题谷歌搜索解决方案 - 我可以使用EXCEPT功能,但个人成员的记录不一定是从一个表到下一个表 - 只是会员ID可能是相同的。

谢谢

4 个答案:

答案 0 :(得分:5)

SELECT
   * (replace with column list)
FROM
   member m
LEFT JOIN
   tblSurvey08 s08
   ON m.member_id = s08.member_id
WHERE 
   s08.member_id IS NULL

只会向您提供不在08年调查中的成员。此连接比NOT IN构造更有效。 由于您正在复制数据,因此新表不是一个好主意。使用上述查询的视图将是更好的选择。

答案 1 :(得分:0)

如果我不理解你的问题,我会提前道歉,但我认为这就是你所要求的。您可以使用insert into声明。

insert into tblPotentialSurvey09
select your_criteria from tblMember where tblMember.MemberId not in (
    select MemberId from tblSurvey08
)

答案 2 :(得分:0)

首先,我不会仅为选择潜在成员而创建新表。相反,我会创建一个新的true / false(1/0)字段,告诉他们是否符合条件。

但是,如果您仍想将数据复制到新表格,请按以下步骤操作:

INSERT INTO tblSurvey00 (MemberID) 
  SELECT MemberID
  FROM tblMember m
  WHERE NOT EXISTS (SELECT 1 FROM tblSurvey09 s WHERE s.MemberID = m.MemberID)

如果您只是想按照我的建议创建一个新字段,那么类似的查询就可以完成这项工作。

答案 3 :(得分:0)

外连接应该:

select m_09.MemberID 
from tblMembers m_09 left outer join 
     tblSurvey08 m_08 on m_09.MemberID = m_08.MemberID 
where 
m_08.MemberID is null