需要重复以及最新日期

时间:2011-05-18 23:18:26

标签: sql-server

我使用的是SQL-Server Enterprise 8.0版。 我有这个问题,变得非常复杂,没有给我我需要的结果。查询运行但添加最新日期后我没有得到任何结果。

目前有三个主要问题。

基本上,我需要在数据库中找到重复的名称并识别它们的相关信息。我希望将重复的名称列和地址放在一起,以便可以比较它们在数据库中出现的次数。因此,如果一个名称在数据库中重复3次,我希望有一个C1名称,C2名称和C3名称。

我还想加入其他表格,这样我就可以获得孩子的名字以及客户端上最新活动(子查询)的信息。

问题#1:自然连接在这里与左外连接组合不起作用。我需要使用工会吗?

问题#2:我正在尝试获取最新活动。虽然Case ..当单独工作时,与其余查询一起放入(减去左外连接)不会产生任何结果。理想情况下,我希望为每个联系人返回最近的活动,选择中的C1和C2。我使用了contactid,但也许那不是我应该使用的?

问题#3:如果一个名字在数据库中出现的次数超过2次,我会在不同的行中获得各种组合。如何在结果列表中将它们显示为一行而不是多个组合?我需要添加C3吗?有多达7个和8个重复的名称..如何让查询变得更加繁琐?还有其他方法吗?

举一个例子,我希望结果如下:

'ContactID 1','ContactID 2','ContactID 3','姓氏','名字','联系人1地址','联系人2地址','联系人3地址','C1家庭电话和工作电话','C2家庭电话和工作电话', 'C3家庭电话和工作电话','C1儿童姓名','C2儿童姓名','C3儿童姓名','C1最近活动','C2最近活动','C3最近活动'

我会将查询简化为基础以保持简单,但此时,我不知道该遗漏什么。请原谅这个繁琐的查询,我很感谢您抽出时间:

SELECT DISTINCT (c1.contactid) as 'ContactID 1', (c2.contactid) as 'ContactID 2', c1.lastname as
  'Last Name', c1.firstname as 'First Name', 
  (c1.address+' '+c1.city+', '+ c1.state +' '+ c1.postalcode) as 'Contact 1 Address', 
  (c2.address+' '+c2.city+', '+ c2.state +' '+ c2.postalcode) as 'Contact 2 Address', 
  (c1.homephone+' '+ c1.workphone) as 'C1 Home phone and Work phone', 
  (c2.homephone+' '+ c2.workphone) as 'C2 Home phone and Work phone',
  (cg.childfirst+' ' +cg.childlast) as 'C1 Child''s Name',
  (cv.childfirst+ ' '+cv.childlast) as 'C2 Child''s Name'
FROM contacts c1, contacts c2 
WHERE (c1.child=0) and (c1.contactid<c2.contactid) and ((c1.lastname + c1.firstname)=  
  (c2.lastname + c2.firstname))
LEFT OUTER JOIN caregiverlabel cg on c1.contactid=cg.contactid,
  contacts c2
LEFT OUTER JOIN caregiverlabel cv on c2.contactid=cv.contactid
  AND c1.contactid IN 
   (SELECT max(MostRecentActivity) 
   FROM (select case
            WHEN c1.modifieddate >= sl.starttime AND c1.modifieddate >= cl.createdate   
                    AND c1.modifieddate >= pr.created AND c1.modifieddate >= pm.created THEN 
                    c1.modifieddate
                    WHEN sl.starttime >= c1.modifieddate AND sl.starttime >= cl.createdate AND 
                    sl.starttime >= pr.created AND sl.starttime >= pm.created THEN sl.starttime
                    WHEN cl.createdate >= c1.modifieddate AND cl.createdate >= sl.starttime AND 
                    cl.createdate >= pr.created AND cl.createdate >= pm.created THEN 
                    cl.createdate
        WHEN pr.created >= c1.modifieddate AND pr.created >= sl.starttime AND 
                    pr.created >= cl.createdate AND pr.created >= pm.created THEN pr.created
        WHEN pm.created >= c1.modifieddate AND pm.created >= sl.starttime AND 
                    pm.created >= cl.createdate AND pm.created >= pr.created THEN pm.created
                    ELSE c1.modifieddate
            END AS MostRecentActivity
    FROM contacts c1
         left outer join serviceslabel sl on c1.contactid=sl.contactid
         left outer join calls cl on c1.contactid=cl.contactid
         left outer join procall pr on c1.contactid=pr.contactid
         left outer join pmpcall pm on c1.contactid=pm.contactid
) AS date_query
)
order by c1.lastname, c1.firstname

1 个答案:

答案 0 :(得分:0)

您发布的查询对我们来说过于复杂。没有人会花时间去除它。但是,以下是获取所有重复行的方法:

选择* 从T join(在col1上选择col1,col2从col组中选择col2,在countc上选择col2(*)&gt; 1)在T.col1 = dups.col1和...上复制

诀窍是先找到重复的“密钥”,然后找到其中有一个重复密钥的所有行。