[gelöst] SQL: Wert in Abhängigkeit aus Tabelle A oder Tabelle B bestimmen



  • Hallo,

    ich habe zwei Tabellen:

    tbl_name
    - id
    - alias_id
    - name

    tbl_alias
    - id
    - name

    Wie muss die SQL Anweisung aussehen, die mir tbl_name.name zurückgibt für alle Einträge in tbl_name, in denen alias_id=0 ist und ansonsten tbl_alias.name für alle Einträge mit alias_id != 0 und tbl_name.alias_id = tbl_alias.id ?

    Wenn jemand noch ne gute SQL Buchempfehlung hat fände ich das toll 😉



  • So, diese Abfrage scheint das zu tun, was ich will

    select tbl_feature1_names.name as name
    from
       tbl_feature1_names
    where
       alias_id = 0
    union
    select tbl_aliases.name as name
    from
       tbl_aliases,
       tbl_feature1_names
    where
       tbl_feature1_names.alias_id = tbl_aliases.id
    

    allerdings habe ich jetzt Probleme, diese Query als Subquery in die eigentlich Abfrage einzubauen :

    select
      sum( tbl_defects.defect_count ),
      name
    from
       tbl_defects,
       (
          select 
             tbl_feature1_names.name AS name
          from
            tbl_feature1_names
         where
            alias_id = 0
         union
         select 
            tbl_aliases.name AS name
         from
            tbl_aliases,
            tbl_feature1_names
         where
           tbl_feature1_names.alias_id = tbl_aliases.id
       )
    where
       tbl_defects.feature1_id = tbl_feature1_names.id
    group by
      feature1_id
    

    Fehlermeldung: every derived table must have its own alias.
    Ich benutze MySQL 5.0.

    Noch kurz die Beschreibung des Zwecks der Übung:
    Eine Tabelle speichert Defektzahlen, jede Defektzahl ist die Kombination aus zwei Merkmalen. Die Merkmalsnamen sind als Fremdschlüssel in jeweils zwei weiteren Tabellen hinterlegt. Diese Merkmalsnamenstabellen ( 😮 ) haben eine id, alias_id und name. Wenn alias_id 0 ist soll der name aus der Merkmalstabelle benutzt werden, ansonsten der Name aus der alias Tabelle.
    Die Abfrage soll die Summe aller Defekte eines Merkmals liefern, zusammen mit dem Merkmalsnamen bzw. dessen Alias.



  • Trial & Error sei Dank:

    select
      sum( D.defect_count ),
      feat1.name as defect_name1
    from
      tbl_defects D,
    (
      select
         N.id as id,
         N.name as name
      from
         tbl_feature1_names N
      where
         N.alias_id = 0
      union
      select
         N.id as id,
         A.name as name
      from
         tbl_feature1_names N,
         tbl_aliases A
      where
        N.alias_id = A.id
    ) feat1
    where
      D.feature1_id = feat1.id 
    group by
      D.feature1_id
    

Anmelden zum Antworten