Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

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

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von stucki1984, 16 Mai 2013.

  1. stucki1984

    stucki1984 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Und da ist es schon dringend?

    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.
     
  3. stucki1984

    stucki1984 Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru


    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
     
  5. stucki1984

    stucki1984 Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    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
     
  7. Tommi

    Tommi Datenbank-Guru

    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
     
    ukulele gefällt das.
  8. stucki1984

    stucki1984 Benutzer

    Hallo Andreas, hallo Tommi,

    schei* auf elegant :) . Hat super funktioniert!

    DANKE EUCH!

    Gruß,

    JS
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden