2017-08-25 7 views
1

Erstellen habe ich eine sehr große SQLite3 Datenbank, die wie folgt aussieht:eine explizite Spalte Index aus einem Index in SQLite

enter image description here

ich aus den 4 Spalten einen Index erstellt oben angezeigt wird:
QUOTE_DATE , EXPIRATION, STRIKE, OPTION_TYPE.
Um dies zu tun, lief ich CREATE INDEX DEST_INDEX ON DATA(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE);.

Ich hatte den Eindruck, dass der Index als neue Spalte in meiner Tabelle hinzugefügt werden würde. Und dass ich meine Datenbank mit diesem Index in einer for-Schleife durchlaufen könnte. Ich habe mich geirrt.

Problem:
ich durch meine Datenbank-Schleife in der Lage sein wollen (außerhalb von SQL, in Matlab, zum Beispiel) durch Abfragen wie SELECT * FROM DATA WHERE INDEX=i machen. Der von mir erstellte Index ist jedoch nicht explizit verfügbar.

Frage:
Ist es möglich, einen expliziten Index als eine Spalte zu erstellen, die die, die ich mit CREATE INDEX erstellt nachahmt?

Ist es möglich, Abfragen mit dem Index durchzuführen, aber ohne WHERE für jede andere Spalte zu verwenden? Gibt es eine bessere Lösung?

Vielen Dank für Ihre Hilfe!

+3

Was Sie diese neue Spalte dachte aussehen würde? Und in Ihrem Beispiel von "SELECT * FROM DATA WO INDEX = i", wie würde "ich" aussehen? Ich glaube nicht, dass "index" bedeutet, was Sie denken, dass es bedeutet, also kann es helfen, wenn Sie mehr über genau erklären, was Sie die Datenbank fragen möchten, und was Sie erwarten, dass die Ergebnisse Ihrer Frage sind. (Ein "Index", in der Datenbank ausgedrückt, ist ein Gerät, das Nachschlagen auf bestimmten Schlüsseln in der Datenbank beschleunigen kann; es wird nicht als sichtbare Spalte verfügbar sein.) –

+0

Hey @MattGibson, danke für deine Hilfe! Ich denke, es ist einfacher, mit 1 Spalte zu erklären und von dort zu erweitern. Nehmen wir an, die ersten 10 Zeilen dieser Spalte haben den gleichen Wert, dann wäre der Index 1. Und dann hat die nächste Zeile einen anderen Wert, und es wiederholt sich für 4 Zeilen, dann wäre der Index 2. Und die nächste Zeile hat einige anderen Wert, und es wird für 23 Zeilen wiederholt, dann wäre der Index 3, und so weiter. Die gleiche Idee für 4 Spalten, aber wenn sich eine der Spalten ändert, würde sich der Index ändern. –

+0

@MattGibson würde es sein, als würde man 'SELECT * FROM DATEN WHERE COL1 = 1stvalForCol1, COL2 = 1stvalForCol2, COL3 = 1stvalForCol3, COL4 = 1stvalForCol4', diese Abfrage zurückholen, tun, was ich tun muss, und dann weiter zu' SELECT gehen * FROM DATEN WHERE COL1 = 2ndvalForCol1, COL2 = 1stvalForCol2, COL3 = 1stvalForCol3, COL4 = 1stvalForCol4' und so weiter. Aber anstatt alle möglichen Werte für jede Spalte kennen zu müssen (was lange dauern würde, um das herauszufinden, weil die Datenbank ziemlich groß ist), könnte ich einfach 'WHERE INDEX = i 'machen und' i' ändern. –

Antwort

1

Aufgrund der Tatsache, dass Sie die neue Tabelle nicht erweitern/aktualisieren müssen, können Sie einfach einen Trigger überspringen und müssen sich keine Gedanken darüber machen, was die Daten einfügen.

So können Sie nur eine neue Version Ihrer Tabelle erstellen, "Idata".
Dann überprüfen Sie das Ergebnis und, wenn Sie es mögen, lassen Sie die alte Tabelle fallen und benennen Sie die neue um.
(I bieten keinen Code für das, weil ich die Datenbank getötet nicht der Autor des Codes haben will. ;-) Es scheint, altes und ist wahrscheinlich zu ersetzen nicht einfach.)

Ich habe meine MCVE für dein Problem, es ist am Ende der Antwort.
Bitte denken Sie darüber nach, einen für Ihre nächste SQLite-Frage bereitzustellen.

Hinweis:
Sie können nur die Tabelle "idxdata" verwenden. Es besteht nur aus den nicht redundanten Einträgen in "Daten". Das würde viel Platz sparen, besonders wenn "Daten" wirklich so groß sind, wie Sie sagen.
In diesem Fall sollten Sie das Schlüsselwort "temporary" entfernen. Und nicht den Code von create table idata überhaupt verwenden.

create temporary table idxdata 
(QUOTE_DATE date, 
    EXPIRATION date, 
    STRIKE int, 
    OPTION_TYPE CHAR(1), 
    idx integer primary key 
); 

insert into idxdata 
    select distinct 
    QUOTE_DATE, 
    EXPIRATION, 
    STRIKE, 
    OPTION_TYPE, 
    NULL 
    from data; 

Inhalt von "idxdata":

2012-01-03|2012-01-06|1000|C|1 
2012-01-04|2012-01-07|1000|C|2 
2012-01-04|2012-01-07|1000|B|3 
2012-02-04|2012-02-07|1000|B|4 

mehr Code für Daten IDATA, mit zusätzlicher idx Säule erstreckt):

create table idata 
(QUOTE_DATE date, 
    EXPIRATION date, 
    STRIKE int, 
    OPTION_TYPE CHAR(1), 
    idx integer); 

insert into idata 
    select * 
    from data 
    join idxdata 
    using (QUOTE_DATE, EXPIRATION, STRIKE, OPTION_TYPE); 

select * from idata; 

OUTPUT:

QUOTE_DATE EXPIRATION STRIKE  OPTION_TYPE idx 
---------- ---------- ---------- ----------- ---------- 
2012-01-03 2012-01-06 1000  C   1 
2012-01-03 2012-01-06 1000  C   1 
2012-01-03 2012-01-06 1000  C   1 
2012-01-03 2012-01-06 1000  C   1 
2012-01-04 2012-01-07 1000  C   2 
2012-01-04 2012-01-07 1000  C   2 
2012-01-04 2012-01-07 1000  C   2 
2012-01-04 2012-01-07 1000  B   3 
2012-01-04 2012-01-07 1000  B   3 
2012-02-04 2012-02-07 1000  B   4 
2012-02-04 2012-02-07 1000  B   4 
2012-02-04 2012-02-07 1000  B   4 

MCVE-Stiftung:

CREATE TABLE data(QUOTE_DATE date, EXPIRATION date, STRIKE int, OPTION_TYPE CHAR(1)); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-03','2012-01-06',1000,'C'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'C'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'B'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-01-04','2012-01-07',1000,'B'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B'); 
INSERT INTO data(QUOTE_DATE,EXPIRATION,STRIKE,OPTION_TYPE) VALUES('2012-02-04','2012-02-07',1000,'B'); 

Verwendung: SQLite 3.18.0 2017-03-28

+0

Wow! Beeindruckend! Ich schätze Ihre Antwort sehr, vielen Dank für Ihre Hilfe und Ihre Bemühungen, dies zu lösen! Ich habe es gerade ausprobiert und verstanden, was du getan hast, und es macht genau das, was ich wollte. Die Tabelle 'idata' ist, was ich will, weil es andere Spalten gibt, die wichtige Variablen enthalten, die jede Zeile variieren, aber nicht zum index idx hinzugefügt werden müssen. Ich werde beim nächsten Mal vorsichtiger mit dem 'MCVE' sein, danke! : D –

Verwandte Themen