如何选择具有关联ID的记录,但在结果中排​​除它们?

时间:2015-10-16 06:37:59

标签: sql sql-server sql-server-2008 tsql

我现在遇到一个非常令人困惑的逻辑来查询某种记录。现在,我有一个表格,其中包含与 ProductID UserEmail 相关联的各种记录。我需要一个确切的sql语句来产生我需要的结果。我想在这里做的是查询或获取与该UserEmail的 ProductID相关联的 ProductIDs 的记录集,并将该记录排除在具有该特定UserEmail的记录之后。查看例如,我在下面有一个表格,我想获取 ProductIDs 的所有记录集,其中 UserEmail = myemail@myemail.com 并排除具有该记录的特定记录USEREMAIL。 我尝试了一些使用join的语句,我最终使用了这个语句但仍然会返回空值。

 SELECT DISTINCT ProductID,UserEmail,Comments,UserName FROM [ProdCommentsTab]
    WHERE NOT EXISTS( SELECT ProductID,UserEmail,Comments,UserName FROM [ProdCommentsTab]
    WHERE  UserEmail = @useremail)

表格

 **ProductID**      **UserEmail**     **UserName**         **Comments**
   c764cbc3      ddgdfh43@yahoo.com    dfgfdhfdhfg     fgshhfdfgh fhdfhhfgj 
   c764cbc3      myemail@myemail.com      MyName      dgsfdhfg fghdfjghj   
   c764cbc3      mitmak84@outlook.com  dgdfgfhfhf   dgsdgdf fghfdhfg 
   f08b9787      dgsdhf23@gmail.com    dfgsdffhhf   dfgsdhf fhfhfhf fhfhfh
   f08b9787      dgsdfgf67@yahoo.com   dgsdgdfhfgh   dfgshf fhdfhg
   f08b9787      myemail@myemail.com     MyName     sdsdgdsgf dfhfhfdg
   f08b9787      sdgsdhf@outlook.com   dgsdgfhfdg    dgsdfhffh fghdjghj
   b1d9dd41      dfsfhfgh45@gmail.com  dsgdfgd       sdgdsgfd fhfdhfg 
   b1d9dd41      myemail@myemail.com      MyName     dgsdhfdg fghdjgj
   e4f9cvd21     sdfgdfdf@yahoo.com    dgsdfhfdfg    dfgshfg fggjgh fghgjg
   e4f9cvd21     sdfdgdf@gmail.com     dfgdshfhf     dfgdhfg fghdfggjg 

输出结果应如下所示

 **ProductID**      **UserEmail**     **UserName**         **Comments**
   c764cbc3      ddgdfh43@yahoo.com    dfgfdhfdhfg     fgshhfdfgh fhdfhhfgj      
   c764cbc3      mitmak84@outlook.com  dgdfgfhfhf      dgsdgdf fghfdhfg 
   f08b9787      dgsdhf23@gmail.com    dfgsdffhhf      dfgsdhf fhfhfhf fhfhfh
   f08b9787      dgsdfgf67@yahoo.com   dgsdgdfhfgh     dfgshf fhdfhg     
   f08b9787      sdgsdhf@outlook.com   dgsdgfhfdg      dgsdfhffh fghdjghj
   b1d9dd41      dfsfhfgh45@gmail.com  dsgdfgd         sdgdsgfd fhfdhfg 

2 个答案:

答案 0 :(得分:2)

首先,EXISTS或NOT EXISTS子句应该是相关的,即你应该将记录与你的外部查询联系起来。 (或使用IN使其不相关。)您想要EXISTS,因为您正在寻找电子邮件存在的产品

然后,您必须在WHERE子句中使用电子邮件本身排除记录。

这里根本不需要DISTINCT。为什么表中会有重复记录?

所以:

 Error in ga$getData(id, start.date = start_date, end.date = end_date,  : 
 error in fetching data: Quota Error: profileId ga:XXXXXXXXX has exceeded the daily request limit.

SQL小提琴:http://www.sqlfiddle.com/#!3/f2644/2

或者使用IN:

select productid, useremail, comments, username 
from prodcommentstab this
where exists
( 
  select *
  from prodcommentstab other
  where  other.useremail = @useremail
  and other.productid = this.productid
)
and useremail <> @useremail;

SQL小提琴:http://www.sqlfiddle.com/#!3/f2644/3

既然您的问题已不再标记为MySQL,那么您只需阅读一次表格即可。它使用分析函数来检查产品是否具有相关电子邮件的条目。由于分析函数不能在WHERE原因中使用,我们需要外部查询来过滤结果。

select productid, useremail, comments, username 
from prodcommentstab
where productid in
( 
  select productid
  from prodcommentstab
  where useremail = @useremail
)
and useremail <> @useremail;

SQL小提琴:http://www.sqlfiddle.com/#!3/f2644/4

通常只扫描一次表来收集所有数据的查询要快得多,所以你可以尝试一下。

答案 1 :(得分:0)

使用自我加入。首先找到与输入电子邮件相关的所有行,一旦找到这些数据,就可以在相同的产品上加入相同的表,但不同的电子邮件ID。尝试使用此:

INotifyPropertyChanged