2011-05-18 109 views
0

我正在使用SQL-Server Enterprise版本8.0。 我有這個查詢變得令人難以置信的複雜,不給我我需要的結果。查詢運行,但我沒有收到最新日期的結果。重複需要以及最新日期

到目前爲止,有三個主要問題。

基本上,我需要在數據庫中找到重複的名稱並識別它們的相關信息。最好是,我想將重複的名稱列和地址放在一起,以便可以比較它們出現在數據庫中的次數。所以,如果一個名字在數據庫中重複三次,我想要有一個C1名稱,C2名稱和C3名稱。

我也想加入其他表格,這樣我就可以獲得孩子的姓名以及客戶端最新活動(子查詢)等信息。

問題#1:自然連接不在此處與左外部連接結合使用。我需要使用工會嗎?

問題2:我正在嘗試獲取最近的活動。雖然Case.When獨自工作,當與查詢的其餘部分(減去左外連接)放在一起不會產生任何結果。理想情況下,我希望爲每個聯繫人返回最近的活動,選擇中的C1和C2。我使用了contactid,但也許這不是我應該使用的?

問題3:如果一個名字在數據庫中出現2次以上,我會在不同的行中爲他們提供各種組合。我怎樣才能讓他們在結果列表中顯示爲一行而不是多個組合?我需要添加C3嗎?有多達7個和8個重複的名稱..如何讓查詢變得更加麻煩?有沒有其他方法可以做到這一點?

爲了提供例子,我想的結果顯示爲這樣:

'的ContactID 1', '的ContactID 2', '3的ContactID', '姓', '名字',「聯繫人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 
+2

如果通過標籤'sql'和'server',你的意思是'sql-server'嗎?如果是這樣,可以更新您的帖子您正在使用的SQL Server版本? – Thomas 2011-05-18 23:21:43

+0

是的,它是SQL Server。我不知道爲什麼這些標籤是分開的,因爲我把它們寫在一起。我會嘗試編輯。 – WixLove 2011-05-18 23:28:00

+0

SQL Server的版本如何? – Thomas 2011-05-18 23:30:18

回答

0

您發佈的查詢對我們來說是太複雜了。沒有人會花時間去解密它。不過這裏是你如何讓所有重複行:

SELECT *在T JOIN(選擇COL1,COL2從T組由COL1,COL2有COUNT(*)> 1)T.col1 = dups.col1的DUP和...

訣竅是首先找到重複的「鍵」,然後找到其中有一個重複鍵的所有行。

+0

是的,謝謝你的回答和反饋。我會試試這種方式,也許會爲最新的活動重新發佈一個更簡單的查詢。 – WixLove 2011-05-23 14:35:33

+0

@ usr - 明白了。它可以找到重複的內容,我不知道你可以這樣加入。謝謝! – WixLove 2011-05-25 18:56:47