2017-11-08 1 views
0

eine Tabelle vor:Oracle - Gekoppelte Spalte in where-Klausel

ID COUNTRY_CODE 
1 ab-cd-ef 
2 gh-ef 
3 cd-ab-pq-xy 

Und ich brauche eine SQL-Abfrage, die die Datensätze auswählt, die einen bestimmten Ländercode enthalten. Die traditionellen LIKE Ansatz funktioniert natürlich:

select ID from TableName where COUNTRY_CODE like '%cd%'; 

Die Sorge hier ist, diese Abfrage würde Millionen von Datensätzen überfahren, wodurch die Kosten der gesamten Betrieb zu erhöhen. Aufgrund der Kostenprobleme sind verschachtelte Tabellen keine Option.

Hinweis: Die Abfrage kann bei Bedarf mit Java parametrisiert werden.

Gibt es eine kostengünstige Möglichkeit, solche durchsuchbaren Spalten zu behandeln?

+0

Wenn diese Tabelle nicht sehr aktualisiert wird, können Sie eine Materialized View erstellen, um doppelte Datensätze für die COUNTRY_CODEs zu erstellen, die mehr als einen Ländercode haben. Auf diese Weise können Sie vermeiden, die Leistung zu verbessern. – STaefi

+0

@STaefi Die Tabelle enthält Millionen von Datensätzen und die Tabelle wächst ständig. Duplikation ist also keine Option. – HitchHiker

Antwort

0

Listen nicht als Begrenzungszeichenfolgen speichern. Entweder erstellen Sie eine separate Tabelle:

CREATE TABLE TableName (id NUMBER PRIMARY KEY); 

CREATE TABLE TableName__Country_Codes(
    id   NUMBER REFERENCES table_name (id), 
    country_code CHAR(2), 
    PRIMARY KEY (id, country_code) 
); 

Dann könnten Sie

SELECT ID 
FROM TableName__Country_codes 
WHERE 'cd' = COUNTRY_CODE; 

verwenden oder eine verschachtelte Tabelle verwenden:

CREATE TYPE Char2List IS TABLE OF CHAR(2) 
/

CREATE TABLE TableName(
    ID NUMBER PRIMARY KEY, 
    Country_Code Char2List 
) NESTED TABLE Country_code STORE AS Table_Name__Country_Codes; 

Dann könnten Sie

SELECT ID 
FROM TableName 
WHERE 'cd' MEMBER OF COUNTRY_CODE; 

Wenn Sie müssen Sie eine getrennte Zeichenfolge als Ihre que verwenden ry soll die Trennzeichen in dem Suchausdruck enthält:

SELECT ID 
FROM TableName 
WHERE '-' || COUNTRY_CODE || '-' like '%-cd-%'; 

Andernfalls, wenn Sie längere Liste Elemente haben dann %cd%cd oder cda oder bbcdbb passen könnte.

+0

Vielen Dank für die Antwort. Der erste Ansatz besteht darin, für jede (id, country_code) Kombination in einer anderen Tabelle einen Eintrag zu erstellen; was aufgrund der Größe des Haupttisches nicht ratsam erscheint. Der zweite Ansatz, wie ich bereits in der Frage erwähnt habe, erhöht die Betriebskosten enorm. – HitchHiker