Announcement

Collapse
No announcement yet.

Select über 3 Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Select über 3 Tabellen

    Hallo zusammen,

    hoffe mir kann jemand weiterhelfen.
    Ich habe in einer Oracle10g DB 3 Tabellen mit folgendem Aufbau.

    [cfg_person] - Tabellenname
    Person_DBID,LastName,FirstName - Spaltennamen

    [cfg_skill]
    Skill_DBID,Skill_Name

    [cfg_skill_level]
    Person_DBID,Skill_DBID,Skill_Level

    Die cfg_person.Person_DBID=cfg_skill_level.Person_DBID und cfg_skill.Skill_DBID=cfg_skill_level.Skill_DBID

    Eine Person(Tabelle1) kann mehrere Skills(Tabelle2) haben mit einem entsprechenden SkillLevel(Tabelle3).

    Die Ausgabe soll folgendermaßen aussehen.
    Last_Name, First_Name

    Wie muss der Select lauten damit mir alle Personen(LastName, FirstName) angezigt werden die folgende Bedingungen erfüllen.
    (Skill_Name='Hausratvers' und Skill_Level=10) UND (Skill_Name='Lebensvers' und Skill_Level=30)

    Der folgende Select gibt mir leider gar nichts aus.
    Code:
    SELECT cfg_person.last_name, cfg_person.first_name
      FROM cfg_person, cfg_skill, cfg_skill_level
     WHERE (    (cfg_person.dbid = cfg_skill_level.person_dbid)
            AND (cfg_skill.dbid = cfg_skill_level.skill_dbid)
            AND (cfg_skill.NAME = 'Hausratvers' and cfg_skill_level.level_ = 10)
            AND (cfg_skill.NAME = 'Lebensvers' and cfg_skill_level.level_ = 30)
           )
    Entferne ich den rot markierten Teil gibt der Select die entsprechenden Personen mit der passenden Kombination Skill/SkillLevel aus. Da die Personen aber mehrere Kombinationen von Skill/Skillevel haben hilft mir das nicht allzuviel.


    Ich hoffe mir kann jemand weiterhelfen.

    Danke im Voraus
    Gruß Mirko

  • #2
    Hallo,

    du must in Deinem Fall die Tabellen 2 Mal benutzen.
    Code:
    SELECT p1.last_name, p1.first_name
      FROM cfg_person      p1,
           cfg_skill       s1,
           cfg_skill_level l1,
           cfg_person      p2,
           cfg_skill       s2,
           cfg_skill_level l2
      WHERE p1.dbid   = l1.person_dbid
        AND s1.dbid   = l1.skill_dbid
        AND s1.NAME   = 'Hausratvers'
        AND l1.level_ = 10
        AND p2.dbid   = l2.person_dbid
        AND s2.dbid   = l2.skill_dbid
        AND s2.NAME   = 'Lebensvers'
        AND l2.level_ = 30
        AND p1.dbid   = p2.dbid
    So sollte es funktionieren.
    In der WHERE-Klausel gibst Du immer Einschränkunen auf eine Zeile der Ergebnismenge an. Da aber in der Spalte NAME der Tabelle cfg_skill nur einer der Beiden von Dir gewünschten Werte stehen kann, geht es nur auf diesem Weg.

    Freundlicher Gruß
    Albernd

    Comment


    • #3
      exists

      Hallo leonov,

      hier bietet sich die "exists" Condition an: "An EXISTS condition tests for existence of rows in a subquery."

      Testdaten
      Code:
      -- Personen
      INSERT into cfg_Person values(1, 'Mustermann', 'Erwin');
      INSERT into cfg_Person values(2, 'Hampelmann', 'Hubert');
      INSERT into cfg_Person values(3, 'Diekmann'  , 'Michael');
      
      -- Kentnisse
      INSERT into cfg_skill values(1, 'Hausratvers');
      INSERT into cfg_skill values(2, 'Lebensvers');
      
      -- Kenntnisse der einzelnen Peronen
      -- Mustermann
      INSERT into cfg_skill_level values(1, 1, 10);
      INSERT into cfg_skill_level values(1, 2, 30);
      -- Hampelmann
      INSERT into cfg_skill_level values(2, 1, 10),
      INSERT into cfg_skill_level values(2, 2, 10);
      -- Diekmann
      INSERT into cfg_skill_level values(2, 1, 0),
      INSERT into cfg_skill_level values(2, 2, 0);
      
      Commit;
      Abfrage
      Code:
      SELECT p.lastname, p.firstname
      from   cfg_person p
      where exists(
                SELECT 1
                from   cfg_skill       s
                    ,  cfg_skill_Level lv
                where  s.skill_DBID = lv.skill_DBID
                and    s.SkillName  = 'Hausratvers'
                and    lv.skill_level = 10
                and    lv.Person_DBID = p.Person_DBID
            )
      and   exists(
                SELECT 1
                from   cfg_skill       s
                    ,  cfg_skill_Level lv
                where  s.skill_DBID = lv.skill_DBID
                and    s.SkillName  = 'Lebensvers'
                and    lv.skill_level = 30
                and    lv.Person_DBID = p.Person_DBID
            )
      
      LASTNAME                       FIRSTNAME                     
      ------------------------------ ------------------------------
      Mustermann                     Erwin                         
      
      1 row selected.
      Gruß, Siegfried

      Comment

      Working...
      X