Hannes: SQL, doppelte Elemente

Hallo hallo!
Folgende Abfrage gibt mir nur die Elemente aus die mehr als einmal vorkommen.

[code lang=sql]
SELECT DISTINCT StaNutzer.NUTZER
FROM StaNutzer
WHERE (((StaNutzer.NUTZER)
  In (select StaNutzer.NUTZER
           from StaNutzer
           group by StaNutzer.NUTZER
           having count(*) > 1
)));
[code]

Wenn ich aber als Spaltenname nun z.B. NUTZER-NEU eingebe, kommt access damit nicht klar. Wie kann ich die Spalte NUTZER-NEU nach der obigen Form abfragen?

Hannes

  1. Hallo Hannes,

    Wenn ich aber als Spaltenname nun z.B. NUTZER-NEU eingebe, kommt access damit nicht klar. Wie kann ich die Spalte NUTZER-NEU nach der obigen Form abfragen?

    das Minuszeichen ist in allen SQL-Dialekten ein Zeichen, das in Bezeichnern nicht einfach so verwendet werden darf. Will man solche Zeichen unbedingt in Bezeichnern wie Spaltennamen, Tabellennamen oder ähnlichem verwenden, so muss man diesen Bezeichner maskieren. Jet-SQL verwendet dazu eckige Klammern:

    [NUTZER-NEU]

    Großbuchstaben für Bezeichner zu verwenden, halte ich übrigens für keine besonders gute Idee. Alle SQL-Schlüsselwörter groß zu schreiben hingegen schon.

    Freundliche Grüße

    Vinzenz

    1. [NUTZER-NEU]

      Danke für deine antwort.
      Allerdings gibt mir access dann 'ne Eingabemaske und will Parameterwerte haben ???

      1. Hallo Hannes,

        [NUTZER-NEU]

        Danke für deine antwort.
        Allerdings gibt mir access dann 'ne Eingabemaske und will Parameterwerte haben?

        wie sieht Deine Abfrage aus, die zu diesem Verhalten führt?

        Freundliche Grüße

        Vinzenz

        1. wie sieht Deine Abfrage aus, die zu diesem Verhalten führt?

          SELECT DISTINCT StaNutzer.[NUTZER-NEU]  
          FROM StaNutzer  
          WHERE (((StaNutzer.[NUTZER-NEU]) In (select StaNutzer.[NUTZER-NEU]  
                               from StaNutzer  
                               group by StaNutzer.[NUTZER-NEU]  
                               having count(*) > 1  
          )));
          
          1. Nur mal so nebenbei

              
            SELECT DISTINCT StaNutzer.[NUTZER-NEU]  
              FROM StaNutzer  
             group by StaNutzer.[NUTZER-NEU]  
            having count(*) > 1  
            
            

            sollte das gleiche Ergebnis liefern wie Deine Abfrage

            SELECT DISTINCT StaNutzer.[NUTZER-NEU]

            FROM StaNutzer
            WHERE (((StaNutzer.[NUTZER-NEU]) In (select StaNutzer.[NUTZER-NEU]
                                 from StaNutzer
                                 group by StaNutzer.[NUTZER-NEU]
                                 having count(*) > 1

            
            
            1. Hallo,

              ergänzend:

              SELECT DISTINCT StaNutzer.[NUTZER-NEU]
                FROM StaNutzer
              group by StaNutzer.[NUTZER-NEU]
              having count(*) > 1

                
              kann man sinnvollerweise noch um das überflüssige Schlüsselwort DISTINCT reduzieren. Bei Gruppierung wird jeder unterschiedliche Eintrag genau einmal aufgeführt. Somit haben wir:  
                
              ~~~sql
              SELECT  
                  StaNutzer.[NUTZER-NEU]  
              FROM  
                  StaNutzer  
              GROUP BY  
                  StaNutzer.[NUTZER-NEU]  
              HAVING  
                  COUNT(*) > 1;  
              
              

              Das funktioniert übrigens in Access 2007 bestens. Nach meinem Kenntnisstand hat sich der unterstützte SQL-Umfang in diesem Bereich seit Access 2.0 nicht verändert, sollte von der von Hannes verwendeten Access-Version gehen. Jet-SQL unterscheidet bei Spaltennamen nicht zwischen Groß- und Kleinschreibung.

              Freundliche Grüße

              Vinzenz

              1. Danke an Alle.
                Hab die Spalten jetzt mit Unterstrich statt mir Bindestrich versehen. Jetzt klappt's ohne Probleme.

      2. Mahlzeit Hannes,

        Allerdings gibt mir access dann 'ne Eingabemaske und will Parameterwerte haben ???

        Dann erkundige Dich, wie Du in dem von Dir benutzten Datenbanksystem Tabellen- und Spaltennamen escapen bzw. maskieren kannst ... sinnvollerweise in der entsprechenden Dokumentation.

        Oder - und das halte ich für die sinnvollere Alternative - verzichte in Tabellen- und Spaltennamen auf Zeichen, die in SQL eine besondere Bedeutung haben ... z.B. Operatoren, Sonderzeichen usw.

        Was spricht gegen eine Benennung wie z.B. "NUTZER_NEU"?

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|