2016-10-21 1 views
2

Ich habe die folgenden Daten in einem vertica db zu verbinden, Mytable:Erstellen Sie eine temporäre Tabelle in Python mit einer SQL-Tabelle

+----+-------+ 
| ID | Value | 
+----+-------+ 
| A |  5 | 
| B |  9 | 
| C | 10 | 
| D |  7 | 
+----+-------+ 

ich eine Abfrage in Python zu erstellen versuchen eine vertica Datenbank zuzugreifen. In Python habe ich eine Liste:

ID_list= ['A', 'C'] 

Ich möchte eine Abfrage erstellen, die im Grunde innere Mytable mit dem ID_list verbindet und dann konnte ich eine WHERE Abfrage machen. So wird es im Grunde so etwas wie dieses

SELECT * 
FROM Mytable 
INNER JOIN ID_list 
    ON Mytable.ID = ID_list as temp_table 
WHERE Value = 5 

sein ich nicht Schreibrechte auf die Datenbank haben, so dass die Tabelle localy werden muss erstellt. Oder gibt es einen alternativen Weg, dies zu tun?

+0

Ich glaube nicht, dass Sie eine temporäre Tabelle lokal erstellen können, aber warum nicht einfach die Werte direkt in der WHERE-Klausel verwenden? –

+0

Nun, die ID_list ist ziemlich lang, würde das funktionieren? Ich meine, schlimmstenfalls kann ich eine Schleife erstellen. – valenzio

+0

Ich weiß Python nicht, so traurig kann ich nicht die volle Antwort geben, aber Sie können 'WHERE IN (5, 10, ...)' verwenden, wenn Vertica das unterstützt. Verwenden Sie eine parametrisierte Abfrage, um eine Injektion zu vermeiden. –

Antwort

1

raschend schnell funktioniert Wenn Sie einen kleinen Tisch haben, dann können Sie als Tim tun vorgeschlagen und schaffen eine in-Liste.

Ich bevorzuge dies jedoch mit Python Möglichkeiten, obwohl. Ich würde wahrscheinlich machen ID_LIST auch ein set als auch von mit dups zu halten usw.

in_list = '(%s)' % ','.join(str(id) for id in ID_list) 

oder einem besseren Nutzung Bind-Variablen (abhängig von der Client Sie verwenden, und wahrscheinlich nicht unbedingt erforderlich, wenn Sie mit einem zu tun Satz von ints, da ich nicht einen Weg zu injizieren sQL mit, dass) vorstellen kann:

in_list = '(%s)' % ','.join(['%d'] * len(ID_list) 

und für Ihre cursor.execute in Ihrem ID_LIST als Parameterliste senden. Diese Methode ist positional, daher müssen Sie die Bindeparameter korrekt anordnen.

Wenn Sie eine sehr, sehr große Liste haben ... könnten Sie eine lokale temporäre erstellen und laden, bevor Sie Ihre Abfrage mit Join durchführen.

CREATE LOCAL TEMP TABLE mytable (id INTEGER); 

COPY mytable FROM STDIN; 
-- Or however you need to load the data. Using python, you'll probably need to stream in a list using `cursor.copy` 

Dann mit mytable verbinden.

Ich würde nicht tun, letzteres mit einer sehr kleinen Anzahl von Zeilen, zu viel Aufwand zu tun.

0

So verwendete ich den Ansatz von Tim:

# create a String of all the ID_list so they can be inserted into a SQL query 
Sql_string='('; 
for ss in ID_list: 
    Sql_string= Sql_string + " " + str(ss) + "," 
Sql_string=Sql_string[:-1] + ")" 

"SELECT * FROM 
(SELECT * FROM Mytable WHERE ID IN " + Sql_string) as temp 
Where Value = 5" 

Verwandte Themen