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

SQL-Abfragen

Dieses Thema im Forum "PostgreSQL" wurde erstellt von NadineF, 2 November 2019.

  1. NadineF

    NadineF Neuer Benutzer

    Hi also ich hab folgendes Problem. Ich soll für die Uni folgende Abfragen durchführen:

    5. Find pairs of ids such that the supplier with the first id charges more for some part than the supplier with the second id.
    6. Find the ids of parts(pids) supplied by at least two different suppliers.

    Wir arbeiten mit folgenden Tabellen :

    - suppliers:
    sid
    sname
    address
    indexes: „suppliers_pkey“ primary key, btree(sid)

    - parts:
    pid
    pname
    color
    indexes: „parts_pkey“ primary key, btree(pid)

    - catalog:
    sid
    pid
    cost
    indexes: „catalog_pkey“ primary key, btree(sid,pid)

    !!In der Angabe wurde jedoch folgendes vorgegeben:
    Solve the queries only with the basic operators(projection, selection, cartesian product/join & set operators) —> do not use aggregation/subqueries

    Habe bereits stundenlang in Foren gesucht jedoch immer nur Lösungen mit subqueries gefunden.
    Wäre sehr dankbar falls mir jemand helfen könnte !
     
  2. akretschmer

    akretschmer Datenbank-Guru

    hilft Dir folgendes weiter?

    Code:
    test=*# select * from catalog ;
     sid | pid | cost
    -----+-----+------
       1 |   1 |   10
       2 |   1 |   12
       1 |   2 |   20
       2 |   2 |   20
       3 |   2 |   20
    (5 rows)
    
    test=*# select c1.sid, c2.sid from catalog c1 join catalog c2 on (c1.pid = c2.pid and c1.cost != c2.cost and c1.sid > c2.sid);
     sid | sid
    -----+-----
       2 |   1
    (1 row)
    
    test=*# select pid from catalog group by pid having count(sid) >= 2;
     pid
    -----
       2
       1
    (2 rows)
    
    test=*#
    
     
    Walter gefällt das.
  3. NadineF

    NadineF Neuer Benutzer

    Vielen Dank für die schnelle Antwort !
    Prinzipiell schon ja aber meines Wissens ist count doch eine Aggregation oder ?
    Weil wir dürfen eben keine Aggregationen verwenden... Geht es auch ohne oder gibt es eh keine andere Lösung.
    LG
     
  4. akretschmer

    akretschmer Datenbank-Guru

    hrm. Mir fällt jetzt nix weiter ein. Das count() ist ja auch nur im HAVING...
     
  5. NadineF

    NadineF Neuer Benutzer

    Aber vielen Dank nochmal für den ersten Teil !! Da wär ich nie draufgekommen :)
     
  6. castorp

    castorp Datenbank-Guru

    Die zweite Frage kann man mit einem self-JOIN auf die catalog Tabelle lösen:
    Code:
    select distinct c1.pid
    from catalog c1
      join catalog c2 on c1.pid = c2.pid and c1.sid <> c2.sid
    Das ist sicherlich wesentlich langsamer als die Lösung mit having.
    Ausserdem "skaliert" es nicht wirklich. Je größer das "mindestens x" wird desto mehr joins braucht man.
     
    akretschmer und Walter gefällt das.
  7. NadineF

    NadineF Neuer Benutzer

    jaa super vielen Dank !! Das ist sicher das was gemeint ist! Aggregationen haben wir noch nicht durchgemacht also dient es nur als Übung und dementsprechend ist Geschwindigkeit noch kein Thema :)
     
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