Die gleiche Zeile kehrt mehrmals zurück

Derzeit habe ich drei Ports in Verwendung in einem Switch und ich versuche, den Verkehr mit dem SQL unten zu überwachen.

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 

Das bekommt mir das Ergebnis, aber jede Zeile wird mehrmals wiederholt, 3 * 3 = 9. Ich habe gesucht und festgestellt, dass manche den Gewerkschaftsoperator benutzen. Aber ich bin verloren, wo ich es sogar ausdrücken kann. Vielen Dank

Eine Vereinigung bedeutet, dass Sie zwei getrennte SELECT-Abfragen haben, die die gleiche Anzahl von Spalten haben und dass Sie das Ergebnis von beiden als eine Ergebnismenge darstellen.

Also im Grunde ist es:

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

Denken Sie daran, dass eine UNION auch distinct ausführen wird, also gibt es keine doppelten Zeilen zurück. Wenn du das nicht willst, benutze UNION ALL

 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%' 

aber wie Sie die gleichen Join-Bedingungen haben und der einzige Unterschied ist im Port dann könnten Sie folgende Abfrage verwenden:

 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' 

Verwenden Sie einfach bedingte Aggregation, so dass Sie nur aus den Tabellen einmal auswählen:

 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