none
Von CTE zum View und Tabelle für MS-Access-Zugriff RRS feed

  • Frage

  • Hallo zusammen, hier im Forum wurde mir bei einer Fragestellung mittels CTE Abfrage geholfen.

    Siehe Thema SQL-Ranking.

    Jetzt stehe ich vor der Frage was mache ich mit meiner CTE. Kannte bzw. konnte bisher nur Sichten aus dem Assistenten. (Bin SQL-Anfänger)

    Ich greife immer via ms-access mittels odbc auf sichten und tabellen dieser datenbank zu.

    Wie bekomme ich es hin:

    a) Access die Abfrage wie einen sicht startet und mir das ergebnis anzeigt.

    b) die Abfrage mir eine tabelle mit den ergbnis macht und diese aktualisiert wird sobald ich ich abfrage starte. glaube hab dazu mal truncate gelesen.

    Würde gerne beide varianten realisieren können.

    a) damit ich jederzeit daraufzugreifen kann.

    b) ich unseren DB Admins sage ich habe hier eine abfrage bitte startet diese mit bei eueren nächtlichen updates und ich auf die gemachte tabelle zugrife via access. Mir fehlen die Rechte für diese Tasks.

    Die Abfrage sieht wie folgt aus.

    WITH    Ordered
              AS ( SELECT   * ,
                            ROW_NUMBER() OVER ( ORDER BY FALLNR, BEGINN ASC ) AS RN
                   FROM     dbo.v_co_du_Belegung_END
                 ),
            GroupToggle
              AS ( SELECT   L.* ,
                            CASE WHEN L.[FALLNR] = R.[FALLNR] THEN 0
                                 ELSE 1
                            END AS NameToggle ,
                            CASE WHEN L.[FALLNR] = R.[FALLNR]
                                      AND L.FAKURZ = R.FAKURZ THEN 0
                                 ELSE 1
                            END AS VornameToggle
                   FROM     Ordered L
                            LEFT OUTER JOIN Ordered AS R ON L.RN = R.RN + 1
                 )
        SELECT  *
        INTO    #GroupToggle
        FROM    GroupToggle;
    /* GGf. mit Index:
    CREATE INDEX IX_GroupToggle ON #GroupToggle (RN) INCLUDE ( NameToggle, VornameToggle);
    */
    WITH    NameGrouping
              AS ( SELECT   *
                   FROM     #GroupToggle O
                            CROSS APPLY ( SELECT    SUM(I.NameToggle)
                                          FROM      #GroupToggle I
                                          WHERE     I.RN <= O.RN
                                        ) C ( NameGroupNo )
                 )
                 
                 SELECT  *
        INTO    #NameGrouping
        FROM    NameGrouping;
        
        SELECT  *
        FROM    #NameGrouping O
                CROSS APPLY ( SELECT    SUM(I.VornameToggle)
                              FROM      #NameGrouping I
                              WHERE     I.NameGroupNo = O.NameGroupNo
                                        AND I.RN <= O.RN
                            ) C ( VornameGroupNo );
    DROP TABLE #GroupToggle;
    DROP TABLE #NameGrouping;
    Danke.

    Gruß Marco

    Dienstag, 14. Mai 2013 18:41

Antworten

  • Hallo Marco,

    Grundsätzlich ist es mit Access möglich SQL Server Abfragen direkt via SQL Passthrough auszuführen.
    Nur wird das bei der langen Abfragedauer kaum ein Vergnügen sein und bricht man es zwischendurch ab, geht alles von vorne los.

    Ebenso ist es möglich eine CTE in einer Sicht einzubinden. Nur mit den temporären Tabellen funktioniert das nicht.

    Sinnvoller dürfte hier sein:
    Erstelle eine gespeicherte Prozedur, die die Daten in permanente Tabellen überträgt.
    Dazu musst Du die Administratoren überzeugen, dass Du
    a) eigene Tabellen dafür bekommst,
    b) sie die Prozedur über einen Auftrag (z. B. nachts) im SQL Server Agent ausführen.

    Zur Laufzeit selbst:
    Die wäre vermutlich (deutlich) zu drücken, wenn man zusätzliche Informationen hinterlegt.
    Denn eine laufende Nummerierung ist naturgemäß bei so großen Datenmengen sehr aufwändig (und langsam).
    (Stefan hatte nicht mehr als Arbeitsgrundlage, an ihm liegt es nicht)

    Gruß Elmar

    • Als Antwort vorgeschlagen Olaf HelperMVP Mittwoch, 15. Mai 2013 17:32
    • Als Antwort markiert marco2709 Donnerstag, 16. Mai 2013 09:37
    Mittwoch, 15. Mai 2013 10:30
    Beantworter

Alle Antworten

  • a) Access die Abfrage wie einen sicht startet und mir das ergebnis anzeigt.

    Hallo Marco,

    so ganz habe ich es auch nach mehrmaligem Lesen nicht verstanden.

    Aber ich denke, das einfachste ist, wenn Du die CTE als View (Abfrage) auf dem SQL Server anlegst (anlegen lässt), dann kannst Du eben so darauf zugreifen und es muss nichts aktualisiert werden etc. Damit solten sich b) + a) + nochmal b) von selbst erledigen.


    Olaf Helper

    Blog Xing

    Dienstag, 14. Mai 2013 18:59
  • Hallo,

    danke für die schnelle Antwort.

    Ich versuche es nochmal laienhaft zu beschreiben:

    In Access verknüpfte ich Tabellen welche mittels ODBC Sichten auf sql sind. Sobald ich diese Tabelle öffne, wird die Sicht generiert und ich sehe das Ergebniss der Sicht als Tabelle in Access.

    In eine Sicht kopieren, habe ich schon versucht. Bin wie folgt vorgegangen. Neue Sicht und habe "Select From" ersetzt durch die ganze Abfrage. Leider erscheinen incorrect syntax fehler INTO auf.

    Gruß

    Marco

    Dienstag, 14. Mai 2013 19:20
  •  Neue Sicht und habe "Select From" ersetzt durch die ganze Abfrage. Leider erscheinen incorrect syntax fehler INTO auf

    Hallo Marco,

    die CTE + Co erstellt eine lokale temporäre Tabelle; das kannst Du, ausser in der aktuellen Session, absolut nirgendwo sonst verwenden.

    Wozu der Umweg über eine Temp Table gut sein soll, verstehe ich nicht so ganz; eigentlich könnte man in der zweiten CTE gleich die 1te verwenden statt der Temp Table.


    Olaf Helper

    Blog Xing

    Dienstag, 14. Mai 2013 19:43
  • Hallo,

    Leider war dies nötig zur performance verbesserung, da im cross 170TZeilen bewegt wurden.

    Die Abfrage war vor den temptabellen nach 60 min noch nicht fertig. Nun ist die abfrage nach 25 minuten fertig.

    gruß

    marco

    Dienstag, 14. Mai 2013 19:56
  • Hallo Marco,

    Grundsätzlich ist es mit Access möglich SQL Server Abfragen direkt via SQL Passthrough auszuführen.
    Nur wird das bei der langen Abfragedauer kaum ein Vergnügen sein und bricht man es zwischendurch ab, geht alles von vorne los.

    Ebenso ist es möglich eine CTE in einer Sicht einzubinden. Nur mit den temporären Tabellen funktioniert das nicht.

    Sinnvoller dürfte hier sein:
    Erstelle eine gespeicherte Prozedur, die die Daten in permanente Tabellen überträgt.
    Dazu musst Du die Administratoren überzeugen, dass Du
    a) eigene Tabellen dafür bekommst,
    b) sie die Prozedur über einen Auftrag (z. B. nachts) im SQL Server Agent ausführen.

    Zur Laufzeit selbst:
    Die wäre vermutlich (deutlich) zu drücken, wenn man zusätzliche Informationen hinterlegt.
    Denn eine laufende Nummerierung ist naturgemäß bei so großen Datenmengen sehr aufwändig (und langsam).
    (Stefan hatte nicht mehr als Arbeitsgrundlage, an ihm liegt es nicht)

    Gruß Elmar

    • Als Antwort vorgeschlagen Olaf HelperMVP Mittwoch, 15. Mai 2013 17:32
    • Als Antwort markiert marco2709 Donnerstag, 16. Mai 2013 09:37
    Mittwoch, 15. Mai 2013 10:30
    Beantworter
  • Hallo Elmar,

    vielen Dank für deine Antwort,

    ich werde deinen beschriebenen Weg mal gehen, sollte keine probleme geben.

    Ich denke die Laufzeit liegt an meiner Sicht, die als Basis dient, dort werden die Daten schon auf 10 Prozent reduziert ;)

    Vielen Dank

    Gruß

    Marco

    Closed

    Mittwoch, 15. Mai 2013 14:15
  • Closed


    Dafür gibt es den Link "Als Antwort markieren" unter dem Post von Elmar; wenn Du darauf klickst, ist Dein Post "Beantwortet" = Closed.

    Olaf Helper

    Blog Xing

    Mittwoch, 15. Mai 2013 17:32