# SQL-Abfrage



## alonzogonzo (28. Aug 2009)

Hallo Community

Ich versuche aus einem Java-Programm eine SQL-Abfrage (auf Oracle-DB) durchzuführen, die mich zum verzweifeln bringt. Es liegt nicht an Java sondern daran, dass ich keine Ahnung habe wie ich die Abfrage bauen muss, damit ich das richtige Resultat erhalte. Ich hoffe ihr verzeiht mir, dass ich eine PL/SQL-Frage in einem Java-Forum stelle.

Kurz zum Program:
Ich lese aus diversen Switches die Mac-Adressen sowie den Port auf dem diese Adressen gesehen werden aus und speichere diese Informationen in die DB. 

So sieht die Tabelle aus:


```
ID   MAC   PORT   SWITCH   DATUM
----------------------------------
1    xxx     49       1      xxx
2    xxx     49       1      xxx
3    xxx     15       1      xxx
4    xxx     49       0      xxx
5    xxx     15       0      xxx
6    xxx     49       0      xxx
7    xxx     8        1      xxx
...
```

Nun sollen für eine bestimmte Sicht die Ports, welche pro Switch mehrfach vorkommen, nicht angezeigt werden.

D.h. ich habe zwei Kriterien nach denen ich Filtern muss und da stehe ich jetzt vollkommen auf dem Schlauch.

Das Resultat nach obiger Tabelle müsste dann so aussehen:


```
ID   MAC   PORT   SWITCH   DATUM
----------------------------------
3    xxx     15       1      xxx
5    xxx     15       0      xxx
7    xxx     8        1      xxx
...
```


Ich hoffe ich habe mich einigermassen verständlich ausgedrückt und dass mir hierbei jemand behilflich sein kein.

Wünsche ein schönes Wochenende.

Grüsse
Phil


----------



## SlaterB (28. Aug 2009)

sei der Name der Tabelle x

dann joine x mit x, Port gleich, Switch gleich, id nicht gleich, 
sammle alle ids in einer Liste

das sind alle die du ausfiltern musst,

führe eine neue Query auf x aus,
where x.id not in (subquery mit der Liste)


-------
edit:
bzw.:
sammle die Ports statt der Ids in einer Liste

und dann
where x.port not in (suquery auf x mit der Liste der Ports)


----------



## sparrow (28. Aug 2009)

alonzogonzo: In deiner Vorgabe ist nicht definiert welches Datum verwendet werden soll. Wie wäre es mit keinem und stattdessen mit der Anzahl der Einträge? Dann könntest du gruppieren.


----------



## JohannisderKaeufer (1. Sep 2009)

```
select count(*), port, switch from tab group by port, switch
```


```
select a.* from tab as a, (select count(*) as x, port, switch from tab group by port, switch) as b where a.port=b.port and a.switch = b.switch and b.x<2
```


----------



## alonzogonzo (2. Sep 2009)

Hallo zusammen

Danke für Eure Hilfe.

@SlaterB: Klingt gut aber mein Problem ist, dass ich nicht weiss wie ich das Query bauen muss.

@Sparrow: Das Datum ist lediglich eine weitere Spalte die für spätere Auswertungen relevant ist. Nach Datum kann ich nicht sortieren.

@Johannis: Das zweite Script sieht vielversprechend aus, läuft aber leider nicht. Habe ich da was übersehen? 

```
Error starting at line 1 in command:
SELECT a.* FROM port_temp AS a, (SELECT count(*) AS x, port, switch FROM port_temp GROUP BY port, switch) AS b WHERE a.port=b.port AND a.switch = b.switch AND b.x<2
Error at Command Line:1 Column:26
Error report:
SQL Error: ORA-00933: SQL-Befehl wurde nicht korrekt beendet
00933. 00000 -  "SQL command not properly ended"
```



Ich habe nun den Weg über eine Zwischentabelle gewählt und zwar mit folgendem Query:


```
insert into portbelegung (
 select * from port_temp
 where id not in (
  select tabelle1.id from port_temp tabelle1, port_temp tabelle2
  where (tabelle1.id <> tabelle2.id) and (tabelle1.port = tabelle2.port) and (tabelle1.switch = tabelle2.SWITCH)
 )
);
```

Vermutlich ginge es auch einfacher aber es kommt wenigstens das raus was ich suche. 

Danke euch allen.

Grüsse
Phil


----------



## sparrow (2. Sep 2009)

Man möge mich verteilen, aber ist dafür nicht HAVING da?


----------



## alonzogonzo (4. Sep 2009)

Hm, wie würde den die Abfrage mit HAVING aussehen?


----------

