Steffen: Frage zu "unnest"

Hi,

kann mir jemand erklären oder Hinweise geben, wieso das Verhalten der folgenden 2 Queries so ist, wie es ist?

select unnest(array[1,2]), unnest(array[3,4]);
 unnest | unnest
--------+--------
      1 |      3
      2 |      4
(2 Zeilen)

select unnest(array[1,2]), unnest(array[3,4,5]);
 unnest | unnest
--------+--------
      1 |      3
      2 |      4
      1 |      5
      2 |      3
      1 |      4
      2 |      5
(6 Zeilen)

Ich hätte erwartet, dass ich entweder im 1. Fall 4 Zeilen, bzw. im 2. Fall nur 3 Zeilen erhalte.

Warum werden im 2. Fall alle Möglichkeiten aufgelöst und warum im 1. nicht?

Grüße

  • Steffen

PS: Postgres

  1. Tach!

    kann mir jemand erklären oder Hinweise geben, wieso das Verhalten der folgenden 2 Queries so ist, wie es ist?

    Die Dokumentationslage zu unnest() ist nicht besonders toll, aber vermutlich ist unnest() hier nicht weiter für das Ergebnis verantwortlich. Das wird wohl an den Eigenheiten PostgreSQLs liegen, wie es unterschiedlich große Datenmengen verknüpft.

    select unnest(array[1,2]), unnest(array[3,4]);
    unnest | unnest
    --------+--------
          1 |      3
          2 |      4
    (2 Zeilen)

    Zumindest sieht es so aus, als ob gleich große Datenmengen quasi im Reißverschlussprinzip verbunden werden.

    select unnest(array[1,2]), unnest(array[3,4,5]);
    unnest | unnest
    --------+--------
          1 |      3
          2 |      4
          1 |      5
          2 |      3
          1 |      4
          2 |      5
    (6 Zeilen)

    Das klappt bei unterschiedlich großen Mengen nicht so gut. Und eigentlich ist es auch üblich, beim Verbinden ohne weitere Kriterien ein kartesisches Produkt zu bilden, also jeden mit jedem zu verheiraten, so wie das hier geschehen ist.

    Warum werden im 2. Fall alle Möglichkeiten aufgelöst und warum im 1. nicht?

    Tja, die Antwort dazu vermute ich mal in Richtung Joins zu finden.

    dedlfix.

    1. Hallo,

      [...] also jeden mit jedem zu verheiraten, so wie das hier geschehen ist.

      spannend zu erfahren, ob dass wirklich so geschieht oder hier nur zufällig so ist!

      Was passiert bei:
      select unnest(array[1,2]), unnest(array[3,4,5,6]);
      ?

      Ich tippe auf vier Ergebniszeilen.

      Gruß,
      Kalk

      1. Tach!

        [...] also jeden mit jedem zu verheiraten, so wie das hier geschehen ist.
        spannend zu erfahren, ob dass wirklich so geschieht oder hier nur zufällig so ist!
        Was passiert bei: select unnest(array[1,2]), unnest(array[3,4,5,6]);?
        Ich tippe auf vier Ergebniszeilen.

        Richtig. Bei 2:5 und 3:7 ist es wieder kartesisch, bei 3:6 sind es auch nur 6 Zeilen. Das ist ein recht seltsames Verhalten.

        dedlfix.

        1. Hi,

          Richtig. Bei 2:5 und 3:7 ist es wieder kartesisch, bei 3:6 sind es auch nur 6 Zeilen. Das ist ein recht seltsames Verhalten.

          wie sieht es bei 3:10 aus? 15 oder 30 Ergebnisse?

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          1. Tach!

            wie sieht es bei 3:10 aus? 15 oder 30 Ergebnisse?

            30. Bei 3:9 nur 10.

            dedlfix.

            1. Hallo,

              wie sieht es bei 3:10 aus? 15 oder 30 Ergebnisse?

              1. Bei 3:9 nur 10.

              danke für die Tipps.

              select generate_series(1,2), generate_series(3,4);

              Vermutlich ist es eher eine Eigenheit vom select. generate_series verhät sich genau gleich.

              Ich werde dort nochmal nachlesen.

              Grüße

              • Steffen
              1. Tach!

                select generate_series(1,2), generate_series(3,4);
                Vermutlich ist es eher eine Eigenheit vom select. generate_series verhät sich genau gleich.

                Es ist garantiert nicht einer Funktion anzulasten, dass sie sich eigenartig verhält, wenn andere Funktionen in der Nähe sind oder nicht. Dazu müsste die Funktion im Prinzip selbst ihre Umgebung einsehen. Oder aber es ist im System generell definiert, dass beim Finden von mehreren Vorkommen ein anderes Verhalten an den Tag zu legen ist. Das wäre aber eine sehr unangenehme Eigenschaft, weil sie schwer verständlich ist. Man tut sowas üblicherweise nicht und ich halte auch die PostgreSQL-Entwickler für klug genug, so etwas nicht zu implementieren.

                Ich werde dort nochmal nachlesen.

                Versuch dein Glück dort, aber schau auch bei den Joins vorbei, denn es ist eher ein Problem mit einem Join-Verhalten.

                dedlfix.

            2. Hallo

              wie sieht es bei 3:10 aus? 15 oder 30 Ergebnisse?

              1. Bei 3:9 nur 10.

              merkwürdig, ich hätte 9 erwartet.

              Gruß
              Kalk

              1. Tach!

                wie sieht es bei 3:10 aus? 15 oder 30 Ergebnisse?

                1. Bei 3:9 nur 10.
                  merkwürdig, ich hätte 9 erwartet.

                Mein Fehler, natürlich waren es nur 9.

                dedlfix.

            3. Hi,

              wie sieht es bei 3:10 aus? 15 oder 30 Ergebnisse?

              1. Bei 3:9 nur 10.

              Hm. Also nicht das kgV.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.