Announcement

Collapse
No announcement yet.

Aletrnative zu "where..not in..."

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

  • Aletrnative zu "where..not in..."

    Hi,

    ich hätte mal wieder was kniffeliges. Ich versuch's mal vereinfacht zu umschreiben.....

    Ich hab eine Tabelle die bisher wie folgt aussah:

    Code:
    IDNR      LOCATION
    ---------------------
    1000     1
    1001     1
    1002     1
    1003     1
    1004     1
    1005     1
    1005     2
    1006     1
    1006     2
    1007     1
    1007     2
    Also anfangs (IDNR<1005) gab es je IDNR nur einen Eintrag, mit der LOCATION=1

    Ab 1005 wurde eine zweite LOCATION eingeführt und ab dem Zeitpunkt werden je IDNR zwei Zeilen eingefügt - Mit LOCATION1 und 2.

    Nun möchte für die IDNR, die bisher nur für die LOCATION 1 einen Eintrag hatten, eine weitere Zeile mit LOCATION 2 einfügen.

    Soweit klar?

    Ich hab das so in Art bisher gemacht:
    Code:
    insert into TABELLE (IDNR,LOCATION) 
        select IDNR,2 from TABELLE where LOCATION=1 and IDNR not in 
        (select IDNR from TABELLE where LOCATION=2)
    Funktionieren müsste das doch... aber da die Tabelle elendig groß ist (ca. 350.000 Einträge) dauert es eeeeewig, ohne daß es zu einem Ergebnis kommt.

    Habt Ihr eine andere bessere Idee?

    Grüße, Avhy.

  • #2
    Hi,

    in diesem Fall würde ich NOT EXISTS verwenden und sicherstellen, dass IDNR in beiden Tabellen indiziert ist.
    Falls MSSQL den MINUS Operator ö.ä. kennt, würde ich den verwenden.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Wie muß das dann heißen?

      Ich glaube, ich bin blond...

      Code:
      insert into TABELLE (IDNR,LOCATION) 
          select IDNR,2 from TABELLE where LOCATION=1 and IDNR not exists 
          (select IDNR from TABELLE where LOCATION=2)
      Die Spalte IDNR hab ich indiziert (nicht eindeutig, nicht gruppiert).

      Ich bekomme einen Syntax-Fehler.

      Comment


      • #4
        Originally posted by Avhy View Post
        Wie muß das dann heißen?

        Ich glaube, ich bin blond...

        Code:
        insert into TABELLE (IDNR,LOCATION) 
            select IDNR,2 from TABELLE where LOCATION=1 and IDNR not exists 
            (select IDNR from TABELLE where LOCATION=2)
        Die Spalte IDNR hab ich indiziert (nicht eindeutig, nicht gruppiert).

        Ich bekomme einen Syntax-Fehler.
        MINUS heißt bei SQL 2005 und höher EXCEPT...

        Code:
        SELECT x.Idnr, 2
        FROM (SELECT IDNr  
                  FROM Tabelle
                  WHERE Location = 1
                  EXCEPT 
                  SELECT IDNR
                  FROM Tabelle
                  WHERE Location = 2
                ) AS X
        Wenn bei der Abfrage das richtige rauskommt, kannst Du ja das Insert-Statement erweitern

        Comment


        • #5
          Dankeschön - hab's hinbekommen!

          Werde ich mir hoch und trocken einlagern - das bekomme ich sonst sicher kein zweites Mal hin (so richtig verstanden hab ich's immer noch nicht, warum das rauskommt, was rauskommt...)

          Noch ne ergänzende Frage...

          Wenn die Tabelle so aussieht:

          Code:
          IDNR      LOCATION   TEXT
          ----------------------------
          1000     1                  Anmerkung
          1001     1                  Blafasel
          1002     1                  Notiz
          1003     1                  ....
          1004     1                  ....
          1005     1                  Irgendein Text
          1005     2                  Hier steht ein anderer Text
          1006     1                  ....
          1006     2                  ....
          1007     1                  .....
          1007     2                  .....
          Wie stelle ich das an, wenn ich IDNR und TEXT haben will, wobei esimmer noch drum geht "da wo's keine LOCATION 2 gibt" - also wenn 1 und 2, dann darf der Text, der vorhanden ist, unterschiedlich sein.

          Also 1005 wäre ok, weil 2x vorhanden, aber mit unterschiedlichem Text.

          Hatte es so probiert:

          Code:
          SELECT x.Idnr,x.text,2
          FROM (SELECT IDNr,text  
                    FROM Tabelle
                    WHERE Location = 1
                    EXCEPT 
                    SELECT IDNR,text
                    FROM Tabelle
                    WHERE Location = 2
                  ) AS X
          Aber dann steht der Text ja innerhalb dessen, was vergleichen wird - und damit hätte ich bei 1005 eine Differenz.
          Und wenn's nicht innerhalb des Selects in der Klammer steht, kann ich's außerhalb nicht selectieren...

          Da ich den Text eh mit einem Standard fülle ('Location 2 erstellt') ist das im Moment egal..nur so des Interesses wegen... ginge das? Und wie?

          Comment

          Working...
          X