2015-11-06 53 views
1

我为这个措辞不通的问题表示歉意,我试图更清楚地说出它,但想不到这样做。如何从表中选择数据,我需要返回在一个字段中具有重复值且在另一个字段中具有指定值的行?

我的问题是这样的:我有一个约20列的表。我需要查找在其中一列中具有特定值的所有行,并且在该列中与另一列中的值至少有一个其他记录相同。

因此,以类似的形式说,我有一个个人数据表(姓名,出生日期,电话号码等)。我如何能够从该表中获得所有姓“琼斯”的人的数据,以及同一姓氏的其他人的同一生日?

我已经试过

select * 
from personal_details 
where surname = 'Jones' 
    and DOB in (select DOB 
       from personal_details 
       where surname = 'Jones' 
       group by DOB 
       having count(*) > 1); 

还没有给我,我要找的设置。任何人都可以指出我正确的方向来思考如何正确地获取这些信息?

+0

我看不到任何原因您的原始查询不起作用。我忽略了明显的东西吗? – shawnt00

回答

2

使用EXISTS若其他人具有相同的姓氏和出生日期但具有不同的电话号码(或其他唯一数据),则返回一个人。

select * 
from personal_details pd1 
where pd1.surname = 'Jones' 
    and exists (select 1 from personal_details pd2 
       where pd2.surname = pd1.surname 
       and pd2.DOB = pd1.DOB 
       and pd2.phone <> pd1.phone) 
+0

完成了这个技巧,谢谢。现在明白我正在看它,我讨厌缓慢的大脑日子。 – Strongo

1

尝试下面的代码。我已经使用Self Join获得结果。

DECLARE @dd AS TABLE (name VARCHAR(1), dob date) 

INSERT INTO @dd VALUES ('A', '2015-11-04'), ('B','2015-11-04'),('C','2015-05-05'),('D','2015-11-04'), ('E','2015-11-04'),('F','2015-12-04') 

SELECT *FROM @dd 

SELECT DISTINCT d.name ,d.dob 
FROM @dd d 
INNER JOIN @dd d1 
    ON (d.dob = d1.dob 
    AND d.name <> d1. name) 
1

作为一个说明,你可以用窗口函数做到这一点:

select pd.* 
from (select pd.*, count(*) over (partition by pd.surname, pd.dob) as cnt 
     from personal_details pd 
     where d.surname = 'Jones' 
    ) pd 
where cnt > 1; 

对于你的榜样,这应该有相似的性能,使用exists答案,假设你有personal_details(surname, dob)的索引。

相关问题