Announcement

Collapse
No announcement yet.

Mehrfache Datensätze finden und bis auf einen Löschen (mit Bedingung aus anderer Tbl)

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

  • Mehrfache Datensätze finden und bis auf einen Löschen (mit Bedingung aus anderer Tbl)

    Hallo,

    ich stehe vor folgendem Problem:

    Ich hab eine Tabelle1 in der Datensätze mehrfach vorkommen und sich nur in der ID unterscheiden. In einer Tabelle2 sind mit dieser ID als FK weitere Datensätze verknüpft. Nun möchte ich in Tabelle2, gerne die ID mit der größten Anzahl an Datensätzen ermitteln und diese Datensätze in Tabelle1 erhalten, während der Rest gelöscht werden soll. Hat da jemand eine Idee?

    Gruß

    trashm

  • #2
    Bei diesem Problem ist es mit einem einfachen Select nicht mehr getan. Bevor man was konkretes dazu sagen kann, müsste man wissen, um welche Datenbank es dabei geht.

    bye,
    Helmut

    Comment


    • #3
      Ms sql 2005

      Comment


      • #4
        ungefähr so
        [HIGHLIGHT="SQL"]DELETE <DeineTabelle1>
        WHERE ID IN ( SELECT ID_D1 FROM <DeineTabelle2>
        WHERE ....
        EXCEPT
        SELECT MAX (ID_D1) FROm <DeineTabelle2>
        WHERE ...
        )[/HIGHLIGHT]

        Comment


        • #5
          Hi ebis,
          es ist nicht die größte ID sondern die ID mit der größten Anzahl an Sätzen gesucht.

          Gruß
          docendo discimus

          Comment


          • #6
            Hallo

            ich habe mal ein Script erzeugt, dass Dir das gewünschte Ergbnis erzeugt.
            Kann umständlich sein, weil ich steh mehr auf ORACLE.
            Script

            /* Erzeuge mal Testtabellen*/
            DROP TABLE TABELLE2;
            DROP TABLE TABELLE1;
            CREATE TABLE TABELLE1(
            ID INT IDENTITY(1,1) PRIMARY KEY ,
            NUMMER INT
            );
            INSERT INTO TABELLE1(NUMMER) VALUES (1);
            INSERT INTO TABELLE1(NUMMER) VALUES (2);
            INSERT INTO TABELLE1(NUMMER) VALUES (3);
            INSERT INTO TABELLE1(NUMMER) VALUES (1);
            INSERT INTO TABELLE1(NUMMER) VALUES (1);

            CREATE TABLE TABELLE2(
            ID INT IDENTITY(1,1) PRIMARY KEY,
            TAB1_ID INT,
            FOREIGN KEY(TAB1_ID) REFERENCES Tabelle1(ID)ON DELETE CASCADE
            );
            /* TAB1_ID referenziert Tabelle1.ID
            ==> In Tabelle1 müssen alle Datensätze ausser ID=1 und ID=3
            gelöscht werden. In Tabelle2 wird wegeg CASCADE auch der Rest gelöscht */
            INSERT INTO TABELLE2(TAB1_ID) VALUES (1);
            INSERT INTO TABELLE2(TAB1_ID) VALUES (2);
            INSERT INTO TABELLE2(TAB1_ID) VALUES (3);
            INSERT INTO TABELLE2(TAB1_ID) VALUES (1);
            INSERT INTO TABELLE2(TAB1_ID) VALUES (1);
            INSERT INTO TABELLE2(TAB1_ID) VALUES (3);
            INSERT INTO TABELLE2(TAB1_ID) VALUES (3);
            /* Hilfstabelle1, wo gruppiert nach Anzahl alles drin steht */
            DROP TABLE XYZ;
            SELECT COUNT(ID) AS ANZAHL, TAB1_ID AS ID INTO XYZ
            FROM TABELLE2 GROUP BY TAB1_ID;
            /* Hilfstabelle2, wo nur die maximale Anzahl drinnen steht */
            DROP TABLE Z;
            SELECT MAX(ANZAHL)AS ANZAHL INTO Z FROM XYZ;
            /* Löschvorgang */
            DELETE FROM TABELLE1 WHERE NOT ID IN (SELECT
            XYZ.ID FROM XYZ,Z WHERE Z.ANZAHL=XYZ.ANZAHL);
            DROP TABLE XYZ;
            DROP TABLE Z;
            /* Ende Scipt */

            Comment

            Working...
            X