2013-01-22 5 views
1

que nous avons deux tables:requête SQL pour obtenir des lignes distinctes de plusieurs tables

Company 
+---+-----+ 
|id | name| 
+---+-----+ 
|1 | bar | 
|2 | foo | 
+---+-----+ 

Branch 
+----+----+-------+ 
|cid | id | profit| 
+----+----+-------+ 
|1 | 10 | 100 | 
|1 | 11 | 200 | 
|2 | 20 | 50 | 
+----+----+-------+ 

--cid in Branch is the foreign key to company id 

La requête est de trouver des entreprises uniques avec au moins une branche ayant profit> 100 dire.

Une façon est:

SELECT DISTINCT c.id, c.name 
    FROM Company c, Branch b 
    WHERE c.id == b.cid AND b.profit > 100; 

Le scénario particulier est que très peu d'entreprises ont des succursales (essentiellement les entrées dans le tableau de la Direction générale est beaucoup moins que ceux Société Compte tenu de ces informations est la requête au-dessus de la meilleure possible. Ou est-il une alternative?

Répondre

2

Une méthode plus efficace peut être d'utiliser une clause EXISTS:

SELECT c.id, c.name 
FROM Company c 
WHERE EXISTS 
(SELECT 1 
FROM Branch b 
WHERE c.id = b.cid AND b.profit > 100) 
+0

J'ai finalement décidé d'aller avec cette compte tenu du scénario spécifique. – amit

1

Votre requête me semble juste, bien que je puisse utiliser des jointures internes par opposition à des jointures croisées, mais identiques. Peut-être que l'utilisation d'une sous-requête pourrait le rendre un peu plus rapide.

SELECT DISTINCT c.id, c.name 
    FROM Company c JOIN (
    SELECT CID FROM Branch WHERE Profit > 100) t ON c.id = t.id 

Je ne sais pas si ce serait plus rapide cependant.

2

Votre requête ressemble bien, je vous suggère d'utiliser ANSI JOIN syntaxe:

SELECT DISTINCT c.id, c.name 
FROM Company c 
INNER JOIN Branch b 
    ON c.id = b.cid 
WHERE b.profit > 100; 
Questions connexes