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

Oracle - % Operator umgehen

Dieses Thema im Forum "Oracle" wurde erstellt von kjh54tergkjjj, 24 März 2016.

  1. kjh54tergkjjj

    kjh54tergkjjj Benutzer

    Hallo,

    wie kann ich eine Division (%) in Oracle umgehen?

    Ich hab gelesen, dass es mit dem kartesisches Produkt und einem (doppelten) Minus klappen sollte.

    Ich hab zwei Relationen (a, b) und möchte a%b darauf ausführen.
    Hat dazu bitte jemand ein Beispiel - wie sieht das in der Praxis aus?

    Beispiel:

    a (A)
    a1
    a2
    a3

    b (A B)
    a1 b1
    a2 b1
    a1 b2
    a3 b3

    Ziel: b/a

    Vielen Dank!
     
    Zuletzt bearbeitet: 24 März 2016
  2. akretschmer

    akretschmer Datenbank-Guru

    suchst Du einen CROSS JOIN ?
     
  3. kjh54tergkjjj

    kjh54tergkjjj Benutzer

    Nö, ich möchte statt DIV dasselbe mit dem kartesischen Produkt und einem Minus lösen, da es in Oracle ja keinen % Operator gibt.
     
  4. kjh54tergkjjj

    kjh54tergkjjj Benutzer

    Hat niemand einen Tip für mich, wie man das lösen könnte?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    wenn du es mal erklären könntest... ein kartesisches Produkt kenne ich als cross join, was genau suchst du?
     
  6. unficyp

    unficyp Fleissiger Benutzer

    was soll bei b/a rauskommen ?
     
  7. kjh54tergkjjj

    kjh54tergkjjj Benutzer

    Beispiel:

    CREATE TABLE r (A varchar(20), B varchar(20));
    CREATE TABLE s (A varchar(20));

    INSERT INTO `r` (`A`,`B`) values ('a1','b1');
    INSERT INTO `r` (`A`,`B`) values ('a2','b1');
    INSERT INTO `r` (`A`,`B`) values ('a3','b1');
    INSERT INTO `r` (`A`,`B`) values ('a1','b2');
    INSERT INTO `r` (`A`,`B`) values ('a2','b2');
    INSERT INTO `r` (`A`,`B`) values ('a1','b3');
    INSERT INTO `r` (`A`,`B`) values ('a2','b3');
    INSERT INTO `r` (`A`,`B`) values ('a3','b3');
    INSERT INTO `r` (`A`,`B`) values ('a4','b3');
    INSERT INTO `r` (`A`,`B`) values ('a2','b4');

    INSERT INTO `s` (`A`) values ('a1');
    INSERT INTO `s` (`A`) values ('a2');
    INSERT INTO `s` (`A`) values ('a3');

    Bei r / s sollte dann rauskommen b1 und b3

    Also all jene Tupel aus r, welche in jeder Kombination mit den Tupoels aus s in r vorkommen.

    In Mysql funktioniert DIV wohl auch nur mit integer und nicht auf varchar.

    Auf jeden Fall möchte ich diese Division anders lösen und zwar mit dem kartesischen Produkt (also eventuell einen Cross Join und dann einem doppelten Minus ==> (r join s) MINUS r oder so ähnlich
     
  8. akretschmer

    akretschmer Datenbank-Guru

    ich würde es in PostgreSQL so lösen:

    Code:
    test=# select * from r;
     a  | b  
    ----+----
     a1 | b1
     a2 | b1
     a3 | b1
     a1 | b2
     a2 | b2
     a1 | b3
     a2 | b3
     a3 | b3
     a4 | b3
     a2 | b4
    (10 Zeilen)
    
    test=# select * from s;
     a  
    ----
     a1
     a2
     a3
    (3 Zeilen)
    
    test=# select b, array_agg(a) from r group by b having array_agg(a) @> (select array_agg(a) from s);
     b  |  array_agg   
    ----+---------------
     b1 | {a1,a2,a3}
     b3 | {a1,a2,a3,a4}
    (2 Zeilen)
    
    Andreas
     
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