SQLite 2 Tabellen vergleichen und nur Unterschiedliche Sätze rausgeben.

vikil

Aktives Mitglied
Hallo zusammen,
brauche eure Unterstützung für SQLITE
Will 2 Tabellen miteinnander vergleich und die Unterschiede anzeigen lassen.
Z.B. Jede Tabelle hat 3 Spalten. es können einträge nur in aeiner Tabelle vorhanden sein.
Z.B

T1
SP1 SP2 SP3

T2
SP1 SP2 SP3

Ansicht
T3
T1.SP1 T1SP2 T1SP3 T2.SP1 T2SP2 T2SP3

Habe die Unterschiede mit folgender Übergabe an SQLITE rausgezogen. Habe nur das problem das nicht in jeder Zelle was drinnsteht, oder Teilweise die Einträge nur in einer Tabelle vorhanden sind. Diese will ich auch anzeigen lassen.
String sql="SELECT * FROM T1 JOIN T2 ON (T1.SP1 != T2.SP1 AND T1.SP2 = T2.SP2 AND T1.SP3 = T2.SP3) OR (T1.SP1 = T2.SP1 AND T1.SP2 != T2.SP2 AND T1.SP3 = T2.SP3) OR (T1.SP1 = T2.SP1 AND T1.SP2 = T2.SP2 AND T1.SP3 != T2.SP3)
Haffe habe mich verständlich ausgedrückt

DANKE
 
Hallo Joose danke erstmals für de schnelle Hilfe. Du hast es richtig verstanden. Es sollen nur die Unterschiede rausgespuckt werden.

Die Beispiele habe ich angeschaut.
Du meinst folgenden oder? dieser währe eigentlich richtig für mich. Das Problem ist SQLITE unterstützt kein FULL/RIGHT JOIN
SELECT A.*, B.*FROM A FULL JOIN B ON(A.C = B.C)WHERE A.C ISNULLOR B.C ISNULL


Habe es wie folgt gelöst (TABELLE ZULI_SW, ZULI_HW)
String sql = "select * from ZULI_SW, ZULI_HW where (SW_Symbol != HW_Symbol AND SW_Adresse = HW_Adresse AND SW_Kommentar = HW_Kommentar) OR ( SW_Symbol = HW_Symbol AND SW_Adresse != HW_Adresse AND SW_Kommentar = HW_Kommentar) OR ( SW_Symbol = HW_Symbol AND SW_Adresse = HW_Adresse AND SW_Kommentar != HW_Kommentar) ";

Kann ich in diese Abfrage, die NULL Abfrage Integrieren ?
Ist es die richtige Vorgehensweise im Bezug auf die Performance?

DANKE
 
In dein aktuelles SQL (Post #3) kannst du natürlich auch eine != NULL Abfrage einbauen.
Ich bin mir auch sicher das es etwas einfacher/simpler/kürzer geht 😉 bin aber noch am überlegen wie ...

EDIT: Haben diese Tabellen eigentlich einen Primary Key?
 
Danke für die schnelle Antwort.
Ja die beiden Tabellen haben einen Primary Key.
Habe es mit DISTINCT Probiert bekomme es aber auch nicht hin.

DANKE
 
Hallo Joose,
will es jetzt so machen, das ich erstmal die unterschide von beiden Tabellen rausziehe und in neue Tabelle schreibe. Danach prüfe in beide Tabellen auf fehlende Einträge mit NOT EXISTS schreibe dies auch in die Tabelle wo unterschiede schon drin sind. Danach filtere ich die ausgabe.

Frage ist wie bekomme ich die ausgewählte Datensätze (aus 2 Tabellen )in einen neu Tabelle rein.
Oder hat jemand bessere Idee.

DANKE
 
Nein, wollte erstmal so ohne probieren.
1->Gibt es eine möglichkeit aus zwei tabellen die Unterschiede (Virtuelle Tabelle)in einer dritter tabelle zu speichern.?
2-> Kann ich aus 2 Tabellen daten zusammenstellen und diese zusammengestellten daten Ändern?
DANKE
 
Habe aber noch kleines Problem,
ich schreibe mit folgendem code die Daten in 3 Tabelle und es ist seeeeeeeeeehr langsam. Gibt es alternativen, oder habe ich hier den falschen Ansatz?
DANKE

Java:
 String del = "DELETE FROM ZULI_VERGLEICH";
            pst = conn.prepareStatement(del);
            pst.execute();

            String sql = "INSERT INTO ZULI_VERGLEICH(SW_Symbol, SW_Adresse, SW_Kommentar, HW_Symbol, HW_Adresse, HW_Kommentar) SELECT SW_Symbol, SW_Adresse, SW_Kommentar, HW_Symbol, HW_Adresse, HW_Kommentar FROM ZULI_SW, ZULI_HW WHERE (SW_Symbol != HW_Symbol AND SW_Adresse = HW_Adresse AND SW_Kommentar = HW_Kommentar) OR ( SW_Symbol = HW_Symbol AND SW_Adresse != HW_Adresse AND SW_Kommentar = HW_Kommentar) OR ( SW_Symbol = HW_Symbol AND SW_Adresse = HW_Adresse AND SW_Kommentar != HW_Kommentar) ";
            pst = conn.prepareStatement(sql);
            pst.execute();
 
Vielleicht solltest du uns mal genauer erklären was Du eigentlich machen willst. Woher kommen die beiden Tabellen die du zusammen fassen willst und warum willst du sie zusammen fassen?
Das Zusammenfassen in einer dritte Tabelle sollte doch nur ein einziges mal nötig sein. Und da ist doch dann egal wie lange es dauert oder?

Ansonsten must du halt mal erklären warum du dauernd verschiedene Tabellen bekommst mit weilweise gleichen Werten.
 
Hallo Thallius, danke erstmals für die schnelle Antwort.
Ich will alle Datensätze aus beiden Tabellen anzeigen welche nicht 1:1 übereinstimmen.
Deswegen habe ich gedacht das ich es mit 3 Schritten die unterschiede aus den beiden vorhandenen Tabellen in einen neue speichere.

1->Stepp Sätze die gleiche und unterchiedliche Werte enthalten
2->Stepp Sätze die nur in Tab1 vorhanden sind
3->Stepp Sätze die nur in Tab2 vorhanden sind

Es sind erstmals ca. 10000-30000 Datensätze, und es dauert mehrere Minuten!

DANKE
 
Jetzt weiß ich immer noch nicht mehr als vorher. Woher kommen die Tabellen und musst du das einmal machen oder immer wieder. Wenn immer wieder,würde ich lieber darüber nachdenken wie ich das abschaffen könnte.

ansonsten hat joose ja bereits im zweiten post den link zur lösung gepostet
 
Ich lese vorher erste CSV Datei ein und lege diese in TAB1 ab.
Danach lese ich die zweite CSV ein und lege diese in Tab 2 ab.
Danach mache ich die drei Stepps und lege die unterteschiedlichen Sätze in Tab 3 ab.

Das ablegen in die 3te Tab soll nur einmalgemacht werden, und die Selektion öfters

Bin für jeden Denkanstoß dankbar..
 
habe ich es richtig verstanden ->2 csv in eine Tabelle einlesen und unterschiede in andere Tabelle ablegen.
Das einlesen ist nicht das Problem dauert ca 500ms.
Wichtig ist das die Sätze bei denen nur ein teil übereinstimmt, gegenüber stehen, damit ich sehe was nicht gleich ist
 
Nein falsch.

Du erzeugst Deine Tabelle einfach mit unique indexen auf allen Spalten und machst dann mit den Datenaus den CSV Datein ein INSERT IGNORE

create table a (y int, b int , v int);
ALTER TABLE a ADD UNIQUE INDEX(y, b, v);
INSERT IGNORE INTO a (y,b,v) VALUES (2,3,4);
INSERT IGNOREINTO a (y,b,v) VALUES (1,3,4);
INSERT IGNOREINTO a (y,b,v) VALUES (1,3,4);

in diesem Fall würde der dritte Eintrag gar nicht geschrieben da er schon existiert.

Zum Schluß hast du nur 1 Tabelle mit allen Datensätzen
 
Hi
habe es probiert. Arbeite mit SQLITEStudio. Habe im SQLIteStudie die 2 Spaltenalls UNIQUE deklariert and bei Konflikt Abort.
Er trägt mir nur den ersten CSV File ein beim 2tem läuft durch, legt aber in der Tabelle nichts ab.
Hier der CODE von 2tem Import
vielleicht siehst du was mit deinem Profi Auge..
Java:
public void zuliHWImport() {

        dateiAuswahl();
        zeitStart = System.currentTimeMillis();
        try {
            if (rs != null) {
                rs.close();
            }

            if (pst != null) {
                pst.close();
            }

        } catch (Exception e) {
        }

        try {
            pst = conn.prepareStatement("INSERT OR IGNORE INTO ZULI_Vergleich VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");

            // pst = conn.prepareStatement("INSERT INTO ZULI_HW VALUES (?, ?, ?, ?, ?, ?);");
            String[] row = new String[4];
            String line;
            BufferedReader bufr;

            bufr = new BufferedReader(
                    new FileReader(dateipfad));
            while ((line = bufr.readLine()) != null) {
                line = line + ", 0";

                row = line.split(",");
                //System.out.println(row[0] + " " + row[1] + " " + row[2] + " " + row[3] + " " + row[4]);

                // String sql_zuli = "Insert into ZULI_SW(SW_Symbol, SW_Adresse, SW_Datentyp, SW_Kommentar, SW_Status ) Values(" + row[0] + "," + row[1] + "," + row[2] + "," + row[3] + "," + row[4] + ")";
                pst.setString(1, row[0]);
                pst.setString(2, row[1]);
                pst.setString(3, row[2]);
                pst.setString(4, row[3]);
                pst.setString(5, row[4]);

                pst.addBatch();

            }
            conn.setAutoCommit(false);
            pst.executeBatch();
            conn.setAutoCommit(true);
            zeitStop = System.currentTimeMillis();
            System.out.println("Verlaufszeit der Schleife für ZULI_HW Import: " + (zeitStop - zeitStart) + " Millisek.");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);

        }

    }
 
dann macht er nur den letzten eintrag.
ich arbeite doch mit pst.addBatch();-> dadurch wird alles gesammelt Und zum Schluss übertragen. ODER VERSTEHE ICH WAS FALSCH
 
Ich nehme an Dein Index wird mit dem SQLiteStudio falsch erzeugt . Mach mal einen Dump von der SQL Structure und stell ihn hier rein.
 
Morgen Sory, konnte erst jetzt antworten.
hofe du kanst mit dem was anfangen, wenn nicht kannst mir vielleicht auf die Sprünge helfen, was ich genai machen muss. DANKE

Code:
ALTER TABLE ZULI_VERGLEICH RENAME TO sqlitestudio_temp_table;

CREATE TABLE ZULI_VERGLEICH (
    SW_Symbol    STRING UNIQUE ON CONFLICT REPLACE,
    SW_Adresse   STRING UNIQUE ON CONFLICT REPLACE,
    SW_Datentyp  STRING,
    SW_Kommentar STRING,
    SW_Status    STRING,
    HW_Symbol    STRING,
    HW_Adresse   STRING,
    HW_Datentyp  STRING,
    HW_Kommentar STRING,
    HW_Status    STRING,
    Vergl_Key           PRIMARY KEY
);

INSERT INTO ZULI_VERGLEICH (
                               SW_Symbol,
                               SW_Adresse,
                               SW_Datentyp,
                               SW_Kommentar,
                               SW_Status,
                               HW_Symbol,
                               HW_Adresse,
                               HW_Datentyp,
                               HW_Kommentar,
                               HW_Status,
                               Vergl_Key
                           )
                           SELECT SW_Symbol,
                                  SW_Adresse,
                                  SW_Datentyp,
                                  SW_Kommentar,
                                  SW_Status,
                                  HW_Symbol,
                                  HW_Adresse,
                                  HW_Datentyp,
                                  HW_Kommentar,
                                  HW_Status,
                                  Vergl_Key
                             FROM sqlitestudio_temp_table;

DROP TABLE sqlitestudio_temp_table;
 
ich habe davor auch geschrieben, das ich die spalten wo nur ein teil unterschiedlich ist, gegenüber stellen will. würde in dem Fall heißen das erste einlesen wird in TAB_VERGLEICH in SW_*eingelesen, das zweite einlesen in HW_*. würde es bei dem weg den wir anheschlagen haben gehen?
 
Oh Mann, erstens ist es ein riesen Unterschied ob ich eine Spalte unique setzte oder ob ich einen unique index über mehrere Spalten mache....

Deine Tabelle muss so in der Art erzeugt werden. Wie das mit SQLiteStudio oder phpmyadmin geht weiß ich nicht da ich Navicat für so etwas benutze.

Code:
-- ----------------------------
--  Table structure for `test`
-- ----------------------------
CREATE TABLE `test` (
  `1` int(11) NOT NULL,
  `2` int(11) NOT NULL,
  `3` int(11) NOT NULL,
  UNIQUE KEY `123` (`1`,`2`,`3`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

und zweitens solltest du jetzt wirklich mal erklären was du da machen willst. Wozu brauchst du die Tabellen. Warum sind es zwei csv und nicht eine? Wenn Du wissen must aus welcher CSV ein Datensatz ist, dann solltest du eine Spalte "CSV-Nummer" in die Tabelle einfügen und nicht mit zwei Tabellen arbeiten. Wenn Du wissen must ob der Datensatz nur in einer oder in beiden vorkommt, dann solltest du eine "Usecount" Spalte einfügen aber keine zwei Tabellen.

Sorry aber wenn du nicht langsam mal rausrückst wozu das Ganze genau gut ist und was das Ergebnis werden soll, können wir noch jahrelang rumraten...
 
ok.
1.ich habe zwei unterschiedliche Dateien
2. ich habe vor gehabt diese einzeln in Tab1(siehe unten) und in Tab2 (siehe unten) einlesen und in Tab3(unterschiede) anzeigen evtl später nach EXCEL exportieren
3.Das Ergebnis sieht folgendermaßen aus( siehe Tab3) Also eigentlich alle datensätze die nicht 1 zu 1 übereinstimmen(unteschiede fett markiert)
4. Wenn das alles funzt, will ich durch selektion nur unterschiede in SP1 oder nur in SP2 oder nur in SP3 mir anzeigen lassen. Ich hoffe so kann man es verstehen was ich vor habe.

Tab1 Tab2
SP1|SP2|SP3| SP1|SP2|SP3
E1 |E2 |E3 | E1 |E2 |E3 -> soll in TAb3 nicht angezeigt werden, da alle Einträge gleich sind
E2 |E2 |E3 | E1 |E2 |E3 ->soll in TAB3 angezeigt werden, da Sp1 unterschiedlich sind
E1 |E2 |E3 | E1 |E3 |E3 |soll in TAB3 angezeigt werden, da Sp2 unterschiedlich sind
E7 |E8 |E9 | E4 |E5 |E6 |soll in TAB3 angezeigt werden, da die Werte SP1, SP2 SP3 nur in Tab1und Tab 2 vorhanden sind

Tab3
Tab1.SP1|Tab1.SP2|Tab1.SP3| Tab2.SP1|Tab2.SP2|Tab2.SP3|
E2 |E2 |E3 | E1 |E2 |E3 |
E1 |E2 |E3 | E1 |E3 |E3 |
E7 |E8 |E9 | | | |
| | | E4 |E5 |E6 |
 
ok.
1.ich habe zwei unterschiedliche Dateien
2. ich habe vor gehabt diese einzeln in Tab1, Tab2 einlesen und in Tab3(unterschiede) anzeigen evtl später nach EXCEL exportieren
3.Das Ergebnis sieht folgendermaßen aus( siehe Tab3) Alsoeigentlich alle datensätze die nicht 1zu 1 übereinstimmen(unteschiede )

Tab1 Tab2
SP1|SP2|SP3| SP1|SP2|SP3
E1 |E2 |E3 | E1 |E2 |E3 -> soll in TAb3 nicht angezeigt werden, da alle Einträge gleich sind
E2 |E2 |E3 | E1 |E2 |E3 ->soll in TAB3 angezeigt werden, da Sp1 unterschiedlich sind
E1 |E2 |E3 | E1 |E3 |E3 |soll in TAB3 angezeigt werden, da Sp2 unterschiedlich sind
E7 |E8 |E9 | E4 |E5 |E6 |soll in TAB3 angezeigt werden, da die Werte SP1, SP2 SP3 nur in Tab1und Tab 2 vorhanden sind

Tab3
Tab1.SP1|Tab1.SP2|Tab1.SP3| Tab2.SP1|Tab2.SP2|Tab2.SP3|
E2 |E2 |E3 | E1 |E2 |E3 |
E1 |E2 |E3 | E1 |E3 |E3 |
E7 |E8 |E9 | | | |
| | E4 |E5 |E6 |
 
Sorry aber ich geb es auf. Du willst anscheinend nicht sagen was du da tolles programmierst und dadurch das du immer wieder die gleichen Informationen runterleierst mit denen man nichts anfangen kann bringt uns nicht weiter.

Du verstehst anscheinend nichts von Datenbanken und wie man sie benutzt. Du denkst vollkommen verkehrt. Man baut nicht verschiedene Tabellen auf damit man diese nachher anzeigen kann. Sowas macht man mit Queries.

Ich bin raus.
 
Sory mit der darstellung habe ich nur versuch darzustellen wie ich es vor gehabt habe. Das es ein falscher Ansatz war habe ich schon verstanden.
unique index über mehrere Spalten-> glaub habe jetzt verstanden was du meinst. Muss weiter selber nach der lösung suchen wie ich es hinbekomme.
Trotzdem danke
 

Zurück
Oben