我使用的是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
答案 0 :(得分:0)
您发布的查询对我们来说过于复杂。没有人会花时间去除它。但是,以下是获取所有重复行的方法:
选择* 从T join(在col1上选择col1,col2从col组中选择col2,在countc上选择col2(*)&gt; 1)在T.col1 = dups.col1和...上复制
诀窍是先找到重复的“密钥”,然后找到其中有一个重复密钥的所有行。