2010-11-09 4 views
0

J'ai 2 tables. La première table est une liste de clients.Comment faire une jointure avec plusieurs conditions dans la deuxième table jointe?

La deuxième table est une liste d'équipements que ces clients possèdent avec un autre champ avec des données sur ce client (problème client). Le problème est que pour chaque client, il peut y avoir plusieurs problèmes.

Je dois faire une jointure sur ces tables mais ne renvoie que les résultats des clients ayant deux de ces problèmes. Le problème est, si je fais une jointure avec OU, j'obtiens des résultats comprenant des clients avec un seul de ces problèmes.

Si je le fais, je n'obtiens aucun résultat car chaque ligne ne comprend qu'une condition.

Comment puis-je faire cela dans T-SQL 2008?

+0

Pouvez-vous préciser votre question, voulez-vous dire que vous devez retrancher un résultat avec 2 ou plusieurs problèmes? – Raymund

+0

@ Raymond: Bien, j'ai besoin de retourner les clients ayant les deux problèmes. – rsteckly

Répondre

4

À moins que je l'ai mal compris, je pense que vous voulez quelque chose comme ça (si vous êtes seulement intéressé par les clients qui ont 2 problèmes spécifiques):

SELECT c.* 
FROM Customer c 
    INNER JOIN CustomerEquipment e1 ON c.CustomerId = e1.CustomerId AND e1.Issue = 'Issue 1' 
    INNER JOIN CustomerEquipment e2 ON c.CustomerId = e2.CustomerId AND e2.Issue = 'Issue 2' 

Ou, pour trouver des clients qui h ave problèmes multiples quel que soit le type:

;WITH Issues AS 
(
    SELECT CustomerId, COUNT(*) 
    FROM CustomerEquipment 
    GROUP BY CustomerId 
    HAVING COUNT(*) > 1 
) 

SELECT c.* 
FROM Customer c 
    JOIN Issues i ON c.CustomerId = i.CustomerId 
0
SELECT * 
FROM customers as c 
LEFT JOIN equipment as e 
ON c.customer_id = e.customer_id --> what you are joining on 
WHERE (
      SELECT COUNT(*) 
      FROM equipment as e2 
      WHERE e2.customer.id = c.customer_id 
    ) > 1 
0

Vous pouvez le faire avec une sous requête au lieu de Jointures:

select * from Customer C where (select Count(*) from Issue I where I.CustomerID = C.CustomerID) < 2 

ou quelle que soit la valeur que vous voulez

+0

Cela ne retournerait-il pas uniquement les lignes qui ont 0 ou 1 problèmes. Il devrait être '> 1' à la fin pour retourner les lignes avec 2 ou plusieurs problèmes ou '= 2' pour retourner les lignes avec seulement 2 problèmes. – Kyra

+0

comme je l'ai écrit avant, vous pouvez utiliser n'importe quelle clause que vous voulez, le jist de la requête est en sélectionnant le nombre dans la sous-requête, j'espère que vous pouvez le changer pour satisfaire à vos besoins. – dexter

Questions connexes