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
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
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
Qu'en est-il de la version de SQL Server? – Thomas