2016-04-28 8 views
1

Ich bin neu in Pentaho und ich führe eine Transformation durch, wo ich zuerst eine Datenbank abfrage, um eine Liste von IDs zu bekommen und dann die Liste in der where-Klausel von a zu verwenden SQL-Anweisung, die eine andere Datenbank abfragt. das heißtPentaho füge eine Liste in die sql where-Klausel ein

wo order_id in ({list})

Wie geben Variablen (die Liste des ids) und sie dann an die Abfrageanweisung in Tabelleneingabe in penthao hinzufügen?

Danke,

Antwort

0

gibt es einige Möglichkeiten, dies zu tun, aber sie sind nicht sehr effektiv. Es sei denn, Ihre Abfrage ist sehr, sehr groß, ich denke, Sie sind besser dran, es ohne der 'where order_id in {list}' Filter und mit einem Stream-Lookup-Schritt, um die Felder, die Sie benötigen, zu erhalten.

1

Sie können veranlassen, dass eine Variable in einem Table input Schritt erweitert wird, indem Sie "Variablen im Skript ersetzen?" und Spezifizieren where order_id in(${list}).

Wenn jedoch die Liste der Werte lang ist, würde ich stattdessen einen Schritt Stream Lookup verwenden. Der Stream-Nachschlage-Schritt liest zu Beginn des Transformationslaufs Werte aus einer Quelle in einen Cache und führt anschließend eine Nachschau in den Cache für jede Zeile durch, die während des regulären Laufs durchlaufen wird.

Es würde wie folgt aussehen:

enter image description here

Die Werte von „Data Grid“ werden zuerst gelesen werden, dann als Lookup-Cache für alle Werte aus dem „Table Eingang“ Schritt verwendet. Sie können dann einen Schritt hinzufügen, um alles abzufließen, das die Suche nicht besteht.

0

Verwenden der dynamischen SQL verbinden:

Sie können eine Kombination von Tabelleneingabe verwenden -> Gruppierung -> Modifizierte Java Script Value -> Dynamische SQL verbinden.

Die Tabelleneingabe wählt die Liste der IDs nach Bedarf aus.

In Gruppe von können Sie die Liste von IDs in eine durch Kommata getrennte String (

Name: "list" (the name of output field with list of IDs) 
Subject: name of the field with IDs from your Table Input, 
Type: "Concatenate strings separated by ," 

)

In Modified Java Script Wert aggregieren Sie ein XML-Literal definieren können, mit Ihren SQL-Abfrage (Sie können stattdessen einen String verwenden und {list} durch den Wert ersetzen, wenn es Ihnen nichts ausmacht, Ihre Abfrage in einer Zeile zu halten).

var sqlQuery = <> 
    SELECT 
     * 
    FROM table_name 
    WHERE 
     order_id IN ({list}) 
</> 

Wenn Sie es wie folgt verwenden, dann {list} wird automatisch mit dem Wert von list Variable (oder Spaltenwert) ersetzt werden. Aber Sie müssen < und> Zeichen innerhalb Ihrer Abfrage entkommen. Alternativ können Sie Ihre Abfrage in CDATA setzen:

var sqlQuery = <> 
    <![CDATA[ 
     SELECT 
      * 
     FROM table_name 
     WHERE 
      order_id IN ({list})  
    ]]> 
</> 

Sie werden nicht <> Escape-Zeichen müssen, aber Sie werden list sich danach ersetzen müssen: sqlQuery = sqlQuery.toString().replace("{list}", list, "g")

Und schließlich haben Sie angeben, Ihre sqlQuery-Variable in der Tabelle "Felder" des JS-Schritts, sodass sie jeder Zeile als neues Feld hinzugefügt wird.

Dann in Dynamic SQL Join müssen Sie sqlQuery Feld in SQL field name angeben. In Template SQL müssen Sie jede Abfrage stellen, die dieselben Datentypen wie Ihre generierte Abfrage hat, z. etwas wie dieses:

SELECT * FROM table_name WHERE 1=0 
Verwandte Themen