SQL EXPRESS 2008: Frage zu Abfrage mit Bedingung (DRINGEND)

stucki1984

Benutzer
Beiträge
9
Hallo zusammen,

ich beschäftige mich seit noch nicht allzu langer Zeit mit SQL-Abfragen. Dabei arbeite ich aktuell mit einer Patentdatenbank. Leider lassen mich meine spärlichen SQL-Kenntnisse gerade im Stich. Vielleicht kann mir ja jemand von euch helfen!?

Folgendes:

Ich habe eine Tabelle in meiner Datenbank, nennen wir Inventorentabelle (InvTab). Dort befinden sich eine Vielzahl an Spalten. Sagen wir, es gäbe die Spalten Patentnummer (PatNr), Erfindername (InvNa) und Wohnort des Erfinders (InvCntry). Bei Patenten verhält es sich nun so, dass daran häufig eine Vielzahl von Erfindern beteiligt sind. Dadurch kann ein Patent in mehreren Zeilen auftauchen. Jeder Erfinder hat dann eine Zeile. Neben dem Erfindernamen (InvNa) befindet sich in der Zeile dann die Patentnummer und das Land, aus dem der/die ErfinderIn stammt. Die Erfinder können wiederum über die eindeutige Patentnummer einem Patent zugeordnet werden.

Ich möchte nun gerne alle Patente extrahiert haben, bei dem mindestens ein deutscher Erfinder beteiligt ist. Es sollen jedoch nicht nur die deutschen Inventoren "ausgespuckt" werden (das habe ich bereits hinbekommen), sondern auch alle ausländischen Erfinder die an dem Patent beteiligt sind, an dem auch ein deutscher Erfinder beteiligt ist. Was ich nicht haben möchte, sind Patente an denen kein deutscher sondern nur Ausländer (bzw. nicht in Deutschland wohnhafte ErfinderInnen) beteiligt sind.

Wie muss die Abfrage bzw. die Bedingung aussehen? Könnt ihr mir vllt. ein paar Bsp. posten?

Ich arbeite mit dem Server Management Studio von MS SQL Server Express R2.

Vielen Dank im Voraus!

Gruß,

JS
 
Werbung:
Hallo zusammen,

ich beschäftige mich seit noch nicht allzu langer Zeit mit SQL-Abfragen. Dabei arbeite ich aktuell mit einer Patentdatenbank. Leider lassen mich meine spärlichen SQL-Kenntnisse gerade im Stich. Vielleicht kann mir ja jemand von euch helfen!?

Und da ist es schon dringend?

Folgendes:

Ich habe eine Tabelle in meiner Datenbank, nennen wir Inventorentabelle (InvTab). Dort befinden sich eine Vielzahl an Spalten. Sagen wir, es gäbe die Spalten Patentnummer (PatNr), Erfindername (InvNa) und Wohnort des Erfinders (InvCntry).

Normalisiere das. Ich zeige Dir keine Lösung für dieses vermukste Dings, sondern wie man es richtig machen könnte:

Code:
test=*# select * from erfindungen ;
 id | patent  | name
----+---------+------
  3 | patent3 |
  1 | patent1 |
  2 | patent2 |
(3 rows)

Time: 0,161 ms
test=*# select * from erfinder ;
 id | name |    land
----+------+-------------
  1 | max  | deutschland
  2 | bill | amiland
(2 rows)

Time: 0,172 ms
test=*# select * from erfunden_von ;
 erfindung | erfinder
-----------+----------
         1 |        1
         2 |        2
         3 |        1
         3 |        2
(4 rows)

Time: 0,195 ms
test=*# select e1.patent, e2.name from erfunden_von e3 left join erfindungen e1 on e3.erfindung=e1.id left join erfinder e2 on e3.erfinder=e2.id where e2.land= 'deutschland';
 patent  | name
---------+------
 patent1 | max
 patent3 | max
(2 rows)

Ist es mit PostgreSQL gemacht, aber das ist hier völlig nebensächlich.
 
Hallo akretschmer,

vielen Dank erstmal für deine Antwort.

Zum ersten Zitat: Ja, es ist dringend, obwohl ich noch nicht lange damit arbeite. Manchmal bekommt man halt "von oben" nicht viel Zeit ;)

Zum zweiten Zitat: Ich weiß, dass die Datenbank nicht gut gestrickt ist. Leider kann ich daran aber kaum etwas ändern. Es handelt sich dabei um eine von der OECD bereitgestellte, riesige Datenbank. Diese jetzt umzustricken, geht dann wohl über mein Ziel hinaus. Im Prinzip hast du aber recht. Dein Ideal-Schema hatte ich auch im Kopf. Leider existiert es aber nicht. Deswegen wollte ich ja eben wissen, ob mir jemand bei der Formulierung einer Bedingung helfen kann!

Kann mir bitte jemand Input geben?

Danke!

Gruß,

JS
 
Hallo akretschmer,

vielen Dank erstmal für deine Antwort.

Zum ersten Zitat: Ja, es ist dringend, obwohl ich noch nicht lange damit arbeite. Manchmal bekommt man halt "von oben" nicht viel Zeit ;)

Zum zweiten Zitat: Ich weiß, dass die Datenbank nicht gut gestrickt ist. Leider kann ich daran aber kaum etwas ändern. Es handelt sich dabei um eine von der OECD bereitgestellte, riesige Datenbank. Diese jetzt umzustricken, geht dann wohl über mein Ziel hinaus. Im Prinzip hast du aber recht. Dein Ideal-Schema hatte ich auch im Kopf. Leider existiert es aber nicht. Deswegen wollte ich ja eben wissen, ob mir jemand bei der Formulierung einer Bedingung helfen kann!

Kann mir bitte jemand Input geben?

Danke!

Gruß,

JS


Frage alle Patente ab, die in (frage alle Patente ab, die wo ein deutscher beteiligt ist)

Forme das in SQL um, that's all.


Andreas
 
Frage alle Patente ab, die in (frage alle Patente ab, die wo ein deutscher beteiligt ist)

Forme das in SQL um, that's all.


Andreas

Hallo Andreas,

nochmals danke. Aber irgendwie verstehe ich dich nicht. Klar, in meinem Kopf bzw. mündlich habe ich die Bedingung wohl auch schon formuliert (á la "Frage alle Patente ab, die in ...")! Aber eben die Umformulierung in SQL bekomme ich doch nicht hin...deswegen habe ich doch hier gefragt? Du stellst aber genau das als selbstverständlich dar...wobei doch genau das meine Frage war?!!?

Vielleicht erklärst du dich ja doch noch bereit, mir zu helfen....???

Gruß,

JS
 
Hallo Andreas,

nochmals danke. Aber irgendwie verstehe ich dich nicht. Klar, in meinem Kopf bzw. mündlich habe ich die Bedingung wohl auch schon formuliert (á la "Frage alle Patente ab, die in ...")! Aber eben die Umformulierung in SQL bekomme ich doch nicht hin...deswegen habe ich doch hier gefragt? Du stellst aber genau das als selbstverständlich dar...wobei doch genau das meine Frage war?!!?

Vielleicht erklärst du dich ja doch noch bereit, mir zu helfen....???

Gruß,

JS

Code:
test=*# create table foo (patent text, erfinder text, land text);
CREATE TABLE
Time: 3,664 ms
test=*# copy foo from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> pat1 max     deutschland
>> pat2 bill    amiland
>> pat3 max     deutschland
>> pat3 bill    amiland
>> \.
Time: 42353,805 ms
test=*# select patent from foo where land = 'deutschland';
 patent
--------
 pat1
 pat3
(2 rows)

Time: 0,245 ms
test=*# select * from foo where patent in (select patent from foo where land = 'deutschland');
 patent | erfinder |    land
--------+----------+-------------
 pat1   | max      | deutschland
 pat3   | max      | deutschland
 pat3   | bill     | amiland
(3 rows)

Andreas
 
Hallo zusammen,

ich hab grad nicht viel Zeit, aber evtl so?

Code:
SELECT *
FROM InvTab A
WHERE PatNr IN (SELECT PatNr FROM InvTab WHERE InvCntry='Germany')

Geth sicher auch eleganter.

Viele Grüße,
Tommi
 
Werbung:
Zurück
Oben