Announcement

Collapse
No announcement yet.

Tabellen Spalten in einen Alias

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

  • Tabellen Spalten in einen Alias

    Hallo,

    wie kann ich mehrere Spalten in einer Abfrage zu einem Alias zusammenfügen?
    Die Spalten, die zusammengefügt werden sollen, sind vom Typ int.
    Hintergrund ist, dass ich die Spalten in einer Spalte in nem DataGridView anzeigen will.
    Habt ihr ne idee?

    So etwas brauche ich ungefähr: (Tabelle1.Nummer, Tabelle2.Nummer, Tabelle3.Nummer) As Nummern

    In nem DataGridView solls nun eine Spalte "Nummern" geben.

    Micha

  • #2
    Man kann ja Integer im SELECT einfach mit CAST() zu Strings wandeln und diese dann zu einem gemeinsamen Feld zusammenfassen, muss aber zB auch noch aufpassen, was passieren soll, wenn ein Feld zB NULL ist.
    Falls du noch etwas konkretere Hilfe brauchst, solltes du angeben, in welcher Beziehung die 3 Tabellen zueinander stehen und ein paraktisches Beispiel dazu (die 3 Tabellen mit jeweils ein paar Demodatensätzen und dann das gewünschte Ergebnis ...).

    bye,
    Helmut

    Comment


    • #3
      hi,

      Also die 3Tabellen haben folgenden Spalten
      Tabelle1: ID,TeileID(PK),Teile
      Tabelle2: ID,TeileID(PK),Teile,Bemerkung
      Tabelle3: ID,TeileID(PK),Teile,Name,Hersteller

      Folgende Abfrage liefert mir

      SELECT Tabelle1.Teile,Tabelle2.Teile,Tabelle3.Teile
      FROM Tabelle1 FULL OUTER JOIN
      Tabelle2 ON Tabelle1.TeileID = Tabelle2.TeileID
      Tabelle3 ON Tabelle2.TeileID = Tabelle3.TeileID


      Tabelle1.Teile Tabelle2.Teile Tabelle3.Teile
      1 Null Null
      2 Null Null
      3 Null Null
      Null Null 3
      Null 6 Null


      Soweit so gut. Die Einzelergebnisse passen.

      Wenn ich jetzt oben stehende Abfrage so aufbaue:
      SELECT (Tabelle1.Teile+Tabelle2.Teile+Tabelle3.Teile) AS Teile
      FROM Tabelle1 FULL OUTER JOIN
      Tabelle2 ON Tabelle1.TeileID = Tabelle2.TeileID
      Tabelle3 ON Tabelle2.TeileID = Tabelle3.TeileID

      dann kommt:

      Teile
      Null
      Null
      Null
      Null
      Null

      Es sollte aber

      Teile
      1
      2
      3
      3
      6
      rauskommen
      Hat jemand ne idee?

      Comment


      • #4
        Hab's ja erwähnt: aufpassen, wenn eines der Elemente NULL ist, dann ist nämlich das Gesamtergebnis NULL. Schreibe also mal:
        (... was ist 'Teile' eigentlich für Typ? integer, varchar?)

        SELECT (IsNull(cast(Tabelle1.Teile as varchar),'')+IsNull(cast(Tabelle2.Teile as varchar),'')+IsNull(cast(Tabelle3.Teile as varchar),'') AS Teile
        FROM Tabelle1 FULL OUTER JOIN
        ...

        Wieder ein Hinweis: wenn man beim casten mit varchar keine Größe mit angibt, gilt der Standardwert 50. Ich nehme aber an, dass Teile eine Zahl ist, die eh nicht soviel Stellen hat.

        bye,
        Helmut

        Comment


        • #5
          Hallo Helmut,
          , gilt der Standardwert 50
          War das beim SQL Server <= 2005?
          In der Doku von 2008 steht

          length
          Eine optionale Ganzzahl, die die Länge des Zieldatentyps angibt. Der Standardwert ist 30.
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Du hast recht, danke für die Korrektur. Hatte da gerade die 50 noch von einer anderen Sache im Kopf.
            Und die 30 gelten auch nur beim CAST, ansonsten ist der Defaultwert 1 (falls das mal wer brauchen sollte).

            bye,
            Helmut

            Comment


            • #7
              Hallo Helmut,

              danke für deine Antwort. Teile ist ein Integer.
              Habs eben mal mit ner DummyDatenbank getestet. Sieht gut aus :-)
              Kann die Abfrage erst Morgen mit den richtigen Werten testen. Ich bin mal guter Dinge.
              Vielen Dank schonmal :-)

              Micha

              Comment


              • #8
                Hallo Helmut,

                habe jetz die Abfrage nochmal mit Originalwerten getestet.
                Nun habe ich den Fall, dass in Tabelle1 und Tabelle2 die TeileID identisch ist (beidemale10). Dann bekomme ich als Ergebnis in der Spalte "Teile" 1010.
                Weil die Spaltenwerte in einen String konvertiert werden und mit dem + eine Stringverknüpfung erfolgt. Für den Fall, dass TeileID in den Tabellen übereinstimmt, muss nur der Wert einer Tabelle der Spalte "Teile" stehen, so dass ich nur eine Zeile habe.
                Hast Du da eine Idee?

                Micha

                Comment


                • #9
                  Hallo Micha,

                  Du kannst die ISNULL Anweisungen auch schachtel wie im folgenden Beispiel; Du erhälst dann sozusagen das erste Feld, das nicht NULL ist. Sind alle drei NULL, dann -1 (oder was Du da gerne als Wert hättest)

                  [highlight=SQL]SELECT IsNull(Tabelle1.Teile,
                  IsNull(Tabelle2.Teile,
                  ISNULL(Tabelle3.Teile, -1))
                  ) AS Teile
                  FROM Tabelle1 [/highlight]
                  Olaf Helper

                  <Blog> <Xing>
                  * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                  Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                  Comment


                  • #10
                    Hallo Olaf,

                    danke für die Antwort.
                    Jetzt bekomme ich statt 1010 2Zeilen mit jeweils 10 in der TeileNr.
                    Jetzt noch aus den 2Zeilen eine bekomme, ist es perfekt. Hast du eine Idee?

                    Micha

                    Comment


                    • #11
                      In Deinem Posting von gestern kamen noch Teile mehrfach vor (die 3).
                      Wenn Du nur alle eindeutig vorhandene "Teile" haben willst, kannst Du
                      SELECT DISTINCT IsNull(..
                      schreiben.

                      Dann kannst Du es auch gleiche ganz einfach formulieren mit
                      [highlight=SQL]SELECT Teile
                      FROM Tabelle1
                      WHERE NOT Teile IS NULL

                      UNION
                      SELECT Teile
                      FROM Tabelle2
                      WHERE NOT Teile IS NULL

                      UNION
                      SELECT Teile
                      FROM Tabelle3
                      WHERE NOT Teile IS NULL[/highlight]

                      Durch das UNION werden die vorhandene "Teile" schon eindeutig selektiert (entgegen dem UNION ALL).
                      Olaf Helper

                      <Blog> <Xing>
                      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                      Comment


                      • #12
                        Hi,

                        es kann sein, dass Teile mehrfach vorkommen (z.B. zweimal die 3). Dann steht in der Ergebnistabelle mit deiner SQL-Abfrage von Heute morgen
                        33 drin? Also eine 3zu viel. Da ja beide werte gleich sind, würde eine 3 reichen.

                        Micha

                        Comment

                        Working...
                        X