2011-05-18 1 views
0

J'utilise SQL-Server Enterprise Version 8.0. J'ai cette requête qui devient incroyablement compliquée et qui ne me donne pas les résultats dont j'ai besoin. La requête s'exécute mais je n'obtiens aucun résultat avec l'ajout de la dernière date.Duplicata nécessaire ainsi que la date la plus tardive

Jusqu'à présent, il existe trois problèmes principaux.

Fondamentalement, j'ai besoin de trouver des noms en double dans une base de données et des informations d'identification à leur sujet. De préférence, je voudrais placer les colonnes et les adresses de noms en double l'une à côté de l'autre afin de pouvoir les comparer autant de fois qu'elles apparaissent dans la base de données. Donc, si un nom est répété 3 fois dans la base de données, je voudrais qu'il y ait un nom C1, un nom C2 et un nom C3. Je voudrais également rejoindre d'autres tables afin que je puisse obtenir des informations telles que le nom de l'enfant et quelle était la dernière activité (la sous-requête) sur le client.

Problème n ° 1: La jointure naturelle ne fonctionne pas ici en combinaison avec les jointures externes gauches. Dois-je utiliser un syndicat?

Problème n ° 2: J'essaie d'obtenir l'activité la plus récente. Alors que le cas .. Lorsque cela fonctionne seul, lorsqu'il est mis en même temps que le reste de la requête (moins les jointures externes gauche) ne produit aucun résultat. Idéalement, j'aimerais que l'activité la plus récente soit retournée pour chaque contact, C1 et C2 dans la sélection. J'ai utilisé le contactid mais peut-être que ce n'est pas ce que je suis censé utiliser? Problème n ° 3: Si un nom apparaît plus de deux fois dans la base de données, j'obtiens toutes sortes de combinaisons dans des lignes différentes. Comment puis-je les faire apparaître dans la liste des résultats comme une ligne et non comme plusieurs combinaisons? Ai-je besoin d'ajouter C3? Il y a jusqu'à 7 et 8 noms en double ... Comment puis-je empêcher la requête de devenir plus encombrante? Y a-t-il d'autres moyens de le faire?

Pour donner un exemple, je voudrais que les résultats apparaissent en tant que tels:

'contactID 1', 'contactID 2', 'contactID 3', 'Nom', 'Prénom', ' Contact 1 Adresse ',' Adresse de contact 2 ',' Adresse de contact 3 ',' Téléphone fixe et téléphone professionnel C1 ',' Téléphone résidentiel C2 et téléphone de travail ', ' C3 Téléphone résidentiel et professionnel ',' C1 Nom de l'enfant ' , 'Nom de l'enfant C2', 'Nom de l'enfant C3', 'Activité la plus récente C2', 'Activité la plus récente C2', 'Activité la plus récente de C3'

Je réduirais la requête à l'essentiel pour la rendre simple, mais à ce stade, je ne sais pas quoi laisser de côté. Pardonnez la requête lourde et je vous remercie d'avoir pris le temps:

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

Si par les balises 'sql' et' server', voulez-vous dire 'sql-server'? Si oui, pouvez-vous mettre à jour votre message sur la version de SQL Server que vous utilisez? – Thomas

+0

Oui, il s'agit de SQL Server. Je ne sais pas pourquoi les étiquettes se sont séparées depuis que je les ai écrites ensemble. Je vais essayer de modifier. – WixLove

+0

Qu'en est-il de la version de SQL Server? – Thomas

Répondre

0

La requête que vous postez est trop complexe pour nous. Personne ne prendra le temps de le déchiffrer. Mais voici comment vous obtenez toutes les lignes en double:

select * de T JOIN (sélectionnez col1, col2 du groupe T par col1, col2 nombre ayant (*)> 1) dups sur T.col1 = dups.col1 et ...

L'astuce consiste à trouver d'abord les "clés" en double, puis de trouver toutes les lignes contenant une des clés en double.

+0

Oui, merci pour votre réponse et vos commentaires. Je vais essayer de cette façon et peut-être republier une requête plus simple pour la dernière activité. – WixLove

+0

@ usr - Je l'ai maintenant. Cela fonctionne pour trouver les doublons et je ne savais pas que vous pouviez vous joindre comme ça. Merci! – WixLove

Questions connexes