Announcement

Collapse
No announcement yet.

SQL Abfrage

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

  • SQL Abfrage

    Hallo zusammen,

    ich habe eine Schwierigkeit mit der Abfrage und zwar, ich habe zwei folgenden Tabellen:

    T1

    Sorte | Nr
    ---------------------------
    TH | 1
    TH | 2
    TH | 3
    TH | 4


    T2

    Sorte | Nr
    ---------------------------
    TH | 5
    TH | 6
    TH | 7
    TH | 8
    TH | 9
    TH | 10


    Nun möchte vereinige beide Tabellen und soll Ergebnis wie folgendes aussehen:

    T3 (Ergesnis)

    Sorte | Nr | Nr
    ---------------------------
    TH | 1 | 5
    TH | 2 | 6
    TH | 3 | 7
    TH | 4 | 8
    TH | - | 9
    TH | - | 10


    Ich habe versucht mit dem Befehl Union, aber ich habe das anderes Ergebnis bekommen, was ich nicht haben möchte und zwar ich könnte nur eine Spalte Nr mit den gesammte Nr bekommen. Das wollte ich nicht. Ich möchte zwei Spalten von Nr und Spalte Sorte wie oben haben. Wie mache ich?

    Vielen Dank für jeden Hinweis
    Viele Grüße
    meocon

  • #2
    Hallo,

    das hängt von Deinen gesamten Daten ab.

    In diesem speziellen Fall könnte das so asussehen:

    Select T2.sorte, t1.nr, t2.nr

    from t2 left outer join t1 on t1.sorte= t2.sorte and t1.nr+4=t2.nr

    order by t2.sorte,t2.nr

    Aber wahrscheinlich ist das für Deine gesamten Daten nicht allgemeingültig genug. Da müsstest Du schon etwas mehr schreiben.

    Gruß
    docendo discimus

    Comment


    • #3
      Hi Frauwue,

      vielen Dank für Deine Hilfe. Aber das ist nicht ganz, was ich haben möchte. Ich habe ein schlechtes Beispiel gegebe und zwar die Werte von der Tabelle T2 müssen nicht immer größer als die Werte von T1. Daher mit der Bedingung Where t1.nr +4 = t2.nr. Also ich möchte nur beide Tabellen vereinigen. Vielleicht hast Du oder jemand eine gute Idee?

      LG
      meocon

      Comment


      • #4
        Hallo meocon,

        du benötigst eine eindeutige Beziehung zwischen den Datensätze aus T1 und T2. Sprich: Nach welcher Regel sollen die Tupel gebildet werden?
        Da SQL mengenorientiert und nicht datensatzorientiert arbeitet, ist diese Beziehung zwingend notwendig!

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo, meocon,

          wenn die Sorte wirklich immer gleich ist und dir egal ist, wie Tabelle A zu Tabelle B verknüpft wird, dann gib doch die Rownum mit und mach so etwas:

          Code:
          WITH a AS (SELECT ROWNUM rn,'TH' a, level w FROM dual
                     CONNECT BY LEVEL<5),
          b AS (SELECT ROWNUM rn, 'TH' a, LEVEL+4 w FROM dual
                     CONNECT BY LEVEL<7),
          c AS (SELECT LEVEL lev FROM dual 
                CONNECT BY LEVEL<=(GREATEST((SELECT COUNT(*) x FROM a)
                                           ,(SELECT COUNT(*) y FROM b))))
          SELECT NVL(a.a,b.a)
                ,a.w
                ,b.w 
          FROM c,a,b
          WHERE c.lev=a.rn(+)
            AND c.lev=b.rn(+);
          
          ergibt: 
          
          NV          W          W
          TH          1          5
          TH          2          6
          TH          3          7
          TH          4          8
          TH                     9
          TH                    10
          
          WITH a AS (SELECT ROWNUM rn,'TH' a, level w FROM dual
                     CONNECT BY LEVEL<7),
          b AS (SELECT ROWNUM rn, 'TH' a, LEVEL+4 w FROM dual
                     CONNECT BY LEVEL<5),
          c AS (SELECT LEVEL lev FROM dual 
                CONNECT BY LEVEL<=(GREATEST((SELECT COUNT(*) x FROM a)
                                           ,(SELECT COUNT(*) y FROM b))))
          SELECT NVL(a.a,b.a)
                ,a.w
                ,b.w 
          FROM c,a,b
          WHERE c.lev=a.rn(+)
            AND c.lev=b.rn(+);
          
          ergibt:
          
          NV          W          W
          TH          1          5
          TH          2          6
          TH          3          7
          TH          4          8
          TH          5
          TH          6
          Gruß

          Ralf

          Comment


          • #6
            Die Verknüpfung über die ROWNUM ist natürlich ein "UNDING" in ORACLE
            Wenn man es macht, dann bietet sich zur Vereinfachung der Lösung von ralfb ein FULL OUTER JOIN an:
            Code:
            Code:
            WITH a AS (SELECT ROWNUM rn,'TH' t, level w FROM dual
                       CONNECT BY LEVEL<5),
            b AS (SELECT ROWNUM rn, 'TH' t, LEVEL+4 w FROM dual
                       CONNECT BY LEVEL<7)
            SELECT NVL(a.t,b.t) sorte
                  ,a.w nr1
                  ,b.w nr2
            FROM a
            FULL OUTER JOIN b
            on a.rn=b.rn

            Comment


            • #7
              Da hat jum natürlich recht. Irgendwie habe ich die "neumodischen" full outer joins noch nicht verinnerlicht ;-)

              Ralf

              Comment

              Working...
              X