2017-09-27 1 views
1

Actuellement, j'ai trois ports en cours d'utilisation dans un commutateur et j'essaie de surveiller le trafic avec le SQL ci-dessous.La même ligne renvoie plusieurs fois

select a.interface, a.utilization_in, b.utilization_out from 
(select z.source as interface, y.samplevalue as utilization_in from #TABLE1 z 
join #TABLE2 y 
on z.table_id = y.table_id 
where z.source = 'switch1' and z.port like 'port_in%') a 

INNER JOIN 

(select x.source as interface, w.samplevalue as utilization_out from #TABLE1 x 
join #TABLE2 w 
on x.table_id = w.table_id 
where x.source = 'switch1' and x.port like 'port_out%') b 
on a.interface=b.interface 

Cela me obtient le résultat, mais chaque ligne est répétée plusieurs fois, 3 * 3 = 9. J'ai cherché et trouvé que certains utilisent l'opérateur syndical. Mais je suis perdu à l'endroit même où le mettre. Merci

Répondre

0

Une union signifie que vous avez deux requêtes SELECT distinctes qui ont le même nombre de colonnes et que vous présentez le résultat des deux en tant que jeu de résultats.

Donc, fondamentalement, il est ceci:

SELECT ... FROM ... WHERE ... 

UNION 

SELECT ... FROM ... WHERE ... 

Rappelez-vous qu'un UNION effectuera une distinct aussi bien, il ne renvoie pas les lignes en double. Si vous ne voulez pas distinct, utilisez UNION ALL

+0

Cela ne lui donne pas ce qu'il veut. – sagi

0
select z.source as interface, y.samplevalue as utilization_in from #TABLE1 z 
join #TABLE2 y 
on z.table_id = y.table_id 
where z.source = 'switch1' and z.port like 'port_in%' 

UNION ALL -- or use just UNION if there are could be duplicates in both parts 

select x.source as interface, w.samplevalue as utilization_out from #TABLE1 x 
join #TABLE2 w 
on x.table_id = w.table_id 
where x.source = 'switch1' and x.port like 'port_out%' 

mais comme vous avez les mêmes conditions de jointure et la seule différence est dans le port, vous pouvez utiliser la requête suivante:

select z.source as interface, y.samplevalue as utilization, CASE WHEN z.port like 'port_in%' THEN 'IN' ELSE 'OUT' END as in_or_out 
from #TABLE1 z 
join #TABLE2 y 
on z.table_id = y.table_id 
where z.source = 'switch1' 
+0

Mais cela ne fournit pas ce qu'il voulait. 'Interface | uti_in | uti_out' – sagi

+0

il fait (au moins la requête sans syndicats) en fournissant une nouvelle colonne –

0

Il suffit d'utiliser conditionnelle Agrégation, de cette façon vous ne sélectionnez qu'une seule fois dans les tables:

select x.source as interface, 
     MAX(CASE WHEN x.port like 'port_out%' THEN w.samplevalue END) as utilization_out, 
     MAX(CASE WHEN x.port like 'port_in%' THEN w.samplevalue END) as utilization_in 
from #TABLE1 x 
join #TABLE2 w 
on x.table_id = w.table_id 
where x.source = 'switch1' 
GROUP BY x.source 
+0

C'est exactement ce dont j'avais besoin, merci !! – kneten