Announcement

Collapse
No announcement yet.

Join und Spaltenalias

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

  • Join und Spaltenalias

    Hallo Zusammen,
    zur Zeit macht mir eine kleine Abfrage zu schaffen, in der ich in einem Join ein Spaltenalias nutzen möchte. Egal wie, ich bekomme die Meldung unzulässiger Spaltenname.
    Danke für Eure Hilfe. Gunther

    Code:
    SELECT
      TABELLE1.ID AS TABELLE1_ID
      ,TABELLE1.ID2 AS TABELLE1_ID2
      ,MENGE2.ID AS MENGE2_ID
      ,MENGE2.ID3 AS MENGE2_ID3
      ,TEILMENGE3.TYPE AS TEILMENGE3_TYPE
      ,TEILMENGE3.ID AS TEILMENGE3_ID
      ,TEILMENGE3.ID3 AS TEILMENGE3_ID3
      ,TEILMENGE3.MENGE AS TEILMENGE3_MENGE
      ,CASE
          WHEN MENGE2.UNIT LIKE 'm2'
          THEN MENGE2.QTY
       END AS MENGE2_QUANTITY
    FROM
      MENGE2
      LEFT OUTER JOIN TABELLE1
        ON MENGE2.ID = TABELLE1.ID
      INNER JOIN TEILMENGE3
        ON TABELLE1.ID = TEILMENGE3.ID
        AND MENGE2_QUANTITY = TEILMENGE3.MENGE
    WHERE
      TABELLE1.DATE BETWEEN @ANFANGSDATUM AND @ENDDATUM
      AND MENGE2.QTY > 1
      AND TEILMENGE3.TYPE = 128
    ORDER BY TABELLE1.ID

  • #2
    Originally posted by Bastelheini View Post
    in der ich in einem Join ein Spaltenalias nutzen möchte. Egal wie, ich bekomme die Meldung unzulässiger Spaltenname.
    Zeigt Dein Entwicklungstool keine Zeile an? Nur die Fehlermeldung?
    Ok, anhand der Meldung brauchst Du eigentlich nur jedes Feld aus Deine Abfrage nehmen und neben die Tabellen halten, bis Du ein Feld nicht zuordnen kannst. Dann hast Du den Fehler gefunden.

    Da Du die Tabellenstruktur nicht verraten hast, kann man diese Frage nur mit Hilfe Phantasie usw. beantworten.
    Eine verdächtige Stelle ist die hier:
    MENGE2_QUANTITY
    Gruß, defo

    Comment


    • #3
      Hallo Defo,
      ja genau um diese Stelle geht es (Zeile 20). Ich möchte das Ergebnis des "Case" weiter oben im Inner Join verwenden "AND MENGE2_QUANTITY = TEILMENGE3.MENGE" .
      Und genau das gestaltet sich schwierig. Ich weiß nicht wie ich diese Bedingung einbauen kann. In der "WHERE" Klausel hab ich es auch schon versucht. Mit dem gleichen Fehler. Der Alias "MENGE2_QUANTITY" wird nicht als Spaltenname akzeptiert.

      Gunther
      Zuletzt editiert von Bastelheini; 14.09.2016, 07:34.

      Comment


      • #4
        Moin,
        also in der Theorie kann das SQL wie folgt aufgebaut werden, aber ob auch das gewünschte Ergebnis erzielt wird, kann ich aktuell nicht beurteilen.

        [highlight=sql]
        SELECT TABELLE1.ID AS TABELLE1_ID,
        TABELLE1.ID2 AS TABELLE1_ID2,
        MENGE2.ID AS MENGE2_ID,
        MENGE2.ID3 AS MENGE2_ID3,
        TEILMENGE3.TYPE AS TEILMENGE3_TYPE,
        TEILMENGE3.ID AS TEILMENGE3_ID,
        TEILMENGE3.ID3 AS TEILMENGE3_ID3,
        TEILMENGE3.MENGE AS TEILMENGE3_MENGE,
        CASE
        WHEN MENGE2.UNIT LIKE 'm2' THEN
        MENGE2.QTY
        END AS MENGE2_QUANTITY
        FROM MENGE2
        LEFT OUTER JOIN TABELLE1
        ON MENGE2.ID = TABELLE1.ID
        INNER JOIN TEILMENGE3
        ON TABELLE1.ID = TEILMENGE3.ID
        AND CASE
        WHEN MENGE2.UNIT LIKE 'm2' THEN
        MENGE2.QTY
        END = TEILMENGE3.MENGE
        WHERE TABELLE1.DATE BETWEEN @ANFANGSDATUM AND @ENDDATUM
        AND MENGE2.QTY > 1
        AND TEILMENGE3.TYPE = 128
        ORDER BY TABELLE1.ID
        [/highlight]

        Comment


        • #5
          Hallo FlexGer,
          ja das funktioniert. Habe ich schon so gemacht. Aber es wiederstrebt mir den gleichen Case zwei Mal auf zu bauen. Macht es ja nicht unbedingt schneller und effizienter. Deswegen suche ich nach einer Lösung das bereits vorhandene Ergebnis zu nutzen. Dabei habe ich auch schon verschieden Schreibweisen mit eckiger Klammer versucht. Der Server bleibt hartnäckig. Ich haben langsam den Verdacht, daß man ein Spaltenalias nicht im Join nutzen kann. (Mit einem Tabellenalias habe ich es schon gebaut.)

          Gunther

          Comment


          • #6
            Kann mir eigentlich nicht vorstellen, dass ein CASE Statement ein Performance Killer ist. Bei einer doppelten Nutzung vermute ich auch, dass die Datenbank sowas merkt und entsprechend cached.
            Also die Join Bedingung liefert nur ein Ergebnis zurück wenn MENGE2.UNIT = m2 ist, daher kann man das SQL meiner Meinung nach auch so aufbauen.
            Was sagst du dazu?

            [highlight=sql]
            SELECT TABELLE1.ID AS TABELLE1_ID,
            TABELLE1.ID2 AS TABELLE1_ID2,
            MENGE2.ID AS MENGE2_ID,
            MENGE2.ID3 AS MENGE2_ID3,
            TEILMENGE3.TYPE AS TEILMENGE3_TYPE,
            TEILMENGE3.ID AS TEILMENGE3_ID,
            TEILMENGE3.ID3 AS TEILMENGE3_ID3,
            TEILMENGE3.MENGE AS TEILMENGE3_MENGE,
            MENGE2.QTY AS MENGE2_QUANTITY
            FROM MENGE2
            LEFT OUTER JOIN TABELLE1
            ON MENGE2.ID = TABELLE1.ID
            INNER JOIN TEILMENGE3
            ON TABELLE1.ID = TEILMENGE3.ID
            WHERE TABELLE1.DATE BETWEEN @ANFANGSDATUM AND @ENDDATUM
            AND MENGE2.QTY > 1
            AND MENGE2.UNIT = 'm2'
            AND TEILMENGE3.TYPE = 128
            ORDER BY TABELLE1.ID;
            [/highlight]

            Comment


            • #7
              Nicht ganz, Nur im Fall "MENGE2.UNIT = 'm2' " möchte ich MENGE2.UNIT zum Vergleich heranziehen sonst nicht. Das Ergebnis der Abfrage habe ich mit zwei mal CASE erreicht (wie oben).
              Aber der Teil mit dem Spaltenalias ist nicht gelöst sondern umgangen. Jetzt möchte ich gern die Sache mit dem Alias irgendwie lösen. Aber da komme ich alleine nicht weiter.

              Comment


              • #8
                Ach so ok. Welcher Wert soll den zum Vergleich verwendet werden, wenn menge2.unit nicht m2 ist?

                Comment


                • #9
                  Hallo, zum besseren Verständnis habe ich mal die gesamte Abfrage hier, obwohl es insgesamt etwas komplexer ist und mir nur der Teil mit dem Case Kummer macht.

                  Code:
                  SELECT
                    TABELLE1.ID AS TABELLE1_ID
                    ,TABELLE1.ID2 AS TABELLE1_ID2
                    ,TABELLE1.STATUS AS TABELLE1_STATUS
                    ,MENGE2.ID AS MENGE2_ID
                    ,MENGE2.UNIT AS MENGE2_UNIT
                    ,TABELLE1.DATE AS TABELLE1_DATE
                    ,MENGE2.ID3 AS MENGE2_ID3
                    ,MENGE2.INVENT AS MENGE2_INVENT
                    ,CASE
                        WHEN MENGE2.UNIT LIKE 'm2'
                        THEN MENGE2.QTYAA
                        WHEN MENGE2.UNIT LIKE 'Bg' OR MENGE2.UNIT LIKE 'Stck.'
                        THEN MENGE2.QTYBB
                     END AS MENGE2_QUANTITY
                    ,TEILMENGE3.QTYAA AS TEILMENGE3_QTYAA
                    ,TEILMENGE3.QTYBB AS TEILMENGE3_QTYBB
                    ,TEILMENGE3.TYPE AS TEILMENGE3_TYPE
                    ,TEILMENGE3.TRANS AS TEILMENGE3_TRANS
                    ,TEILMENGE3.ID AS TEILMENGE3_ID
                    ,TEILMENGE3.ID3 AS TEILMENGE3_ID3
                    ,TEILMENGE3.AMOUNT AS TEILMENGE3_AMOUNT
                  FROM
                    MENGE2
                    LEFT OUTER JOIN TABELLE1
                      ON MENGE2.ID = TABELLE1.ID
                    INNER JOIN TEILMENGE3
                      ON MENGE2.ID3 = TEILMENGE3.ID3
                      AND TABELLE1.ID = TEILMENGE3.ID
                      AND TABELLE1.DATE = TEILMENGE3.DATE
                      AND CASE
                        WHEN MENGE2.UNIT LIKE 'm2'
                        THEN MENGE2.QTYAA
                        WHEN MENGE2.UNIT LIKE 'Bg' OR MENGE2.UNIT LIKE 'Stck.'
                        THEN MENGE2.QTYBB
                     END = TEILMENGE3.QTYAA
                    INNER JOIN
                      (
                      SELECT
                        MAX_TEILMENGE3.ID
                        ,MAX(MAX_TEILMENGE3.DOCUMENT) AS [MAX_DOCUMENT]
                        ,MAX_TEILMENGE3.DATE
                      FROM
                        TEILMENGE3 AS MAX_TEILMENGE3
                      WHERE
                        AND MAX_TEILMENGE3.DATE BETWEEN @ANFANGSDATUM AND @ENDDATUM
                        AND MAX_TEILMENGE3.TRANS = 1
                      GROUP BY
                        MAX_TEILMENGE3.DATE
                        ,MAX_TEILMENGE3.ID
                        ,MAX_TEILMENGE3.ID3
                      ) AS MAXIMUM_TEILMENGE3
                    ON TEILMENGE3.DOCUMENT = MAXIMUM_TEILMENGE3.MAX_DOCUMENT
                  WHERE
                    TABELLE1.DATE BETWEEN @ANFANGSDATUM AND @ENDDATUM
                    AND MENGE2.QTYAA > 1
                    AND TABELLE1.STATUS != '375'
                    AND TEILMENGE3.ITEMTYPE = 128
                    AND
                      (
                        TEILMENGE3.TRANS = 0
                        OR TEILMENGE3.TRANS = 1
                       )
                  ORDER BY TABELLE1.ID
                  OPTION
                    (RECOMPILE)

                  Comment


                  • #10
                    Wie wäre es mit diesem Ansatz?

                    [highlight=sql]
                    select *
                    from (SELECT TABELLE1.ID AS TABELLE1_ID,
                    TABELLE1.ID2 AS TABELLE1_ID2,
                    TABELLE1.STATUS AS TABELLE1_STATUS,
                    MENGE2.ID AS MENGE2_ID,
                    MENGE2.UNIT AS MENGE2_UNIT,
                    TABELLE1.DATE AS TABELLE1_DATE,
                    MENGE2.ID3 AS MENGE2_ID3,
                    MENGE2.INVENT AS MENGE2_INVENT,
                    CASE
                    WHEN MENGE2.UNIT = 'm2' THEN
                    MENGE2.QTYAA
                    WHEN MENGE2.UNIT = 'Bg' OR MENGE2.UNIT = 'Stck.' THEN
                    MENGE2.QTYBB
                    END AS MENGE2_QUANTITY
                    FROM MENGE2
                    LEFT OUTER JOIN TABELLE1
                    ON MENGE2.ID = TABELLE1.ID
                    WHERE TABELLE1.DATE BETWEEN @ANFANGSDATUM AND @ENDDATUM
                    AND MENGE2.QTYAA > 1
                    AND TABELLE1.STATUS != '375') a
                    INNER JOIN TEILMENGE3
                    ON a.MENGE2_ID3 = TEILMENGE3.ID3
                    AND a.TABELLE1_ID = TEILMENGE3.ID
                    AND a.TABELLE1_DATE = TEILMENGE3.DATE
                    AND a.MENGE2_QUANTITY = TEILMENGE3.QTYAA
                    INNER JOIN (SELECT MAX_TEILMENGE3.ID,
                    MAX(MAX_TEILMENGE3.DOCUMENT) AS [ MAX_DOCUMENT ],
                    MAX_TEILMENGE3.DATE
                    FROM TEILMENGE3 AS MAX_TEILMENGE3
                    WHERE AND MAX_TEILMENGE3.DATE BETWEEN @ANFANGSDATUM AND
                    @ENDDATUM AND MAX_TEILMENGE3.TRANS = 1
                    GROUP BY MAX_TEILMENGE3.DATE,
                    MAX_TEILMENGE3.ID,
                    MAX_TEILMENGE3.ID3) AS MAXIMUM_TEILMENGE3
                    ON TEILMENGE3.DOCUMENT = MAXIMUM_TEILMENGE3.MAX_DOCUMENT
                    where TEILMENGE3.ITEMTYPE = 128 AND
                    (TEILMENGE3.TRANS = 0 OR TEILMENGE3.TRANS = 1)
                    ORDER BY a.TABELLE1_ID
                    [/highlight]
                    Zuletzt editiert von FlexGer; 14.09.2016, 14:40. Reason: like ersetzt

                    Comment


                    • #11
                      Auf den ersten Blick sieht es wie der Ansatz aus, den ich gesucht habe. Komme aber heute leider nicht mehr dazu. Melde mich morgen wieder. Was nutzt Du eigentlich für einen Editor?

                      Comment


                      • #12
                        Ok freut mich wenn ich weiterhelfen konnte.
                        Ich bin eigentlich nur in Oracle unterwegs und verwende hauptsächlich den PL/SQL Developer.

                        Comment


                        • #13
                          Hallo FlexGer, es tut so wie es soll. Jetzt gibt es noich eine Unstimmigkeit mit den Ergebnissen, das ist aber ein struktureller Grund und keiner der vom Code kommt. Danke

                          Comment

                          Working...
                          X