2012-04-05 4 views
1

J'ai 3 tables avec lesquelles je travaille. La tableA contient les informations pour le client, chaque ligne contient toutes les informations pour une personne spécifique.Requête SQL complexe renvoyant des résultats non désirés

La table B contient des informations sur un message créé par une personne dans TableA.

ID DistID Subject Message CreatedDate StatusID SentTotal 
57 3 MonList MonList 2012-03-19 16:21:36.117 2 4 

La tableC contient une liste de personnes qui ont accès au message dans la TableB.

ID  MessageID DistID StatusID Important OriginalMessagelID 
25111 58   516  1   0  NULL 
25112 58   519  1   0  NULL 
25114 58   374  1   0  NULL 
25115 58   5545  1   0  NULL 
25116 58   23435  1   0  NULL 

TableC MessageID sera le même que TableB ID. TableB et TableC DistID référencent le DistID dans la TableA (tableau A inclus moyen de beaucoup d'informations à copier même pour une seule ligne, il s'agit d'un ratio de 1 à 1, 1 ligne pour un client)

J'ai besoin de produire une requête qui relie ces trois tables ensemble. Voici ce que j'ai jusqu'à présent:

SELECT * 
FROM Distributor d 
INNER JOIN Messages ms 
    ON ms.DistID = d.DistID 
INNER JOIN Message m 
    ON m.DistID = d.DistID 
WHERE ((d.DCLoginDate <= (GETDATE() - 3) OR d.DCLoginDate IS NULL) AND (CONVERT(VARCHAR(8), m.CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1))) 

Maintenant TableB peut avoir plusieurs messages créés par le même client, de sorte que leur DistID peut être présent dans ce tableau plus de 1 fois. TableC est de la même manière, le DistID peut être présent dans cette table plus d'une fois.

je commencé à faire des requêtes individuelles qui ont travaillé:

SELECT * 
FROM Distributor 
WHERE (DCLoginDate <= (GETDATE() - 3) OR DCLoginDate IS NULL) 

SELECT * 
FROM Message m 
INNER JOIN Messages ms 
    ON ms.MessageID = m.ID 
WHERE ((CONVERT(VARCHAR(8), CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1))) 

Les travaux ci-dessus correctement, quand j'ai essayé de les combiner en une seule déclaration, il a commencé à revenir 0 quand je serais revenu deux (de mes données en direct , pas les données fournies ci-dessus).

Quelqu'un comprend comment faire fonctionner efficacement?

Répondre

2

Vos conditions de jointure étaient différentes entre la requête unique et les requêtes individuelles ... Qu'en est-il?

SELECT * 
FROM Distributor d 
INNER JOIN Messages ms 
    ON ms.DistID = d.DistID 
INNER JOIN Message m 
    ON m.ID = ms.MessageID 
WHERE 
    ((d.DCLoginDate <= (GETDATE() - 3) OR d.DCLoginDate IS NULL) AND 
    (CONVERT(VARCHAR(8), m.CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1))) 
+0

Merci qui a fonctionné comme il était censé renvoyer 2 résultats. Parfois, les choses les plus difficiles à trouver sont les plus simples. Le travaillé. –

+0

@ JamesWilson De rien, content que cela ait aidé! –

Questions connexes