0

私はいくつかのテーブルを持っています。私も質問があります。私の問題は、Java を使用して SQL クエリを動的に生成することです。

別のテーブルに次のフィールドがあります。

 Collumn name          status
po_number,               Y
unit_cost,               Y
placed_date ,            Y
date_closed,             Y
scheduled_arrival_date   Y
date_closed              Y 
order_quantity           Y
roll_number              N
product_sku              N
product_category_name    N
rec_vendor_quantity      Y  
vendor_name              Y
et_conversion_unit_quantity Y

ステータスが のときにクエリを生成する必要があります。Yここでの問題は、上記の列です

次のクエリは、上記の出力です。

ここではすべての列を含めましたが、ステータスが の列を除外する必要がNあります。Java を使用してクエリを作成するのを手伝ってください。

select
pi.po_number,poi.unit_cost,pi.placed_date CreateDate,
case when isnull(pi.date_closed) then pi.scheduled_arrival_date  
else pi.date_closed end as ReceviedDate,
poi.order_quantity,poi.roll_number,p.product_sku product_name,
pc.product_category_name,poi.rec_vendor_quantity,pv.vendor_name,p.et_conversion_unit_quantity,pi.note
from
purchase_order as pi,
purchase_order_inventory as poi,
product_vendors as pv,
products AS p,
product_categories AS pc
where
pi.purchase_order_id=poi.purchase_order_id and
pc.product_category_id=p.product_category_id and
poi.product_id = p.product_id and
poi.product_category_id=pc.product_category_id and
pi.vendor_id=pv.product_vendor_id and
( ( pi.date_closed  >= '2012-01-01' and pi.date_closed <='2012-09-05 23:59:59' ) 
or ( pi.scheduled_arrival_date  >= '2012-01-01' and pi.scheduled_arrival_date <='2012-09-05 23:59:59') ) and
pi.po_type=0 
and pi.status_id = 0 and  poi.transaction_type = 0  
order by pi.po_number 

アップデート :

クエリ:STEP 1:

SELECT rcm.id,rcm.tablename,rcm.columnname,rcm.size,rcm.displayorder,rcm.isactive FROM report_customise_master rcm where rcm.tablename !='employee' and rcm.isactive='Y' order by rcm.displayorder;

ステップ 2: クエリを構築するための Java メソッド:

public Map getComplexReportQuery() {
    String query = "SELECT rcm.id,rcm.tablename,rcm.columnname,rcm.size,rcm.displayorder,rcm.isactive FROM report_customise_master rcm where rcm.tablename !='employee' and rcm.isactive='Y' order by rcm.displayorder;";
    String tableName = "", from = "", select = "";
    StringBuffer sb = new StringBuffer();
    Map<String, List<String>> resultsMap = new LinkedHashMap<String, List<String>>();
    Map<String, String> displayOrderMap = new LinkedHashMap<String, String>();
    Map queryMap = new LinkedHashMap();
    if (!query.isEmpty() || query.length() > 0) {
        sb.append(query);
    }

    Connection connection = getConnection();
    if (connection != null) {
        try {
            PreparedStatement reportQueryPS = connection.prepareStatement(sb.toString());
            ResultSet reportQuery_rst = reportQueryPS.executeQuery();
            List<String> tables = new ArrayList<String>();;
            if (reportQuery_rst != null) {
                StringBuilder selectQuery = new StringBuilder(" SELECT ");
                StringBuilder fromQuery = new StringBuilder(" FROM ");
                while (reportQuery_rst.next()) {
                    tableName = reportQuery_rst.getString("tablename");
                    List<String> columns = resultsMap.get(tableName);
                    if (columns == null) {
                        columns = new ArrayList<String>();
                        resultsMap.put(tableName, columns);
                    }
                    columns = resultsMap.get(tableName);
                    String columnName = reportQuery_rst.getString("columnname");

                    columns.add(columnName);
                }
                tableName = "";
                for (Entry<String, List<String>> resultEntry : resultsMap.entrySet()) {
                    tableName = resultEntry.getKey();
                    List<String> columns = resultEntry.getValue();
                    int i = 0;
                    for (String column : columns) {
                        selectQuery.append(tableName + "." + column);
                        if (i != columns.size()) {
                            selectQuery.append(",");
                        } else {
                            selectQuery.append("");
                        }
                        i++;
                    }
                    if (!tables.contains(tableName)) {
                        tables.add(tableName);
                    }
                }
                //to remove comma at the end of line
                select = selectQuery.toString().replaceAll(",$", "");
                tableName = "";
                int i = 0;
                for (String table : tables) {
                    fromQuery.append(table);
                    fromQuery.append(" ");
                    fromQuery.append(table);
                    if (i != tables.size()) {
                        fromQuery.append(",");
                    } else {
                        fromQuery.append("");
                    }
                    i++;
                }
                from = fromQuery.toString().replaceAll(",$", "");
                queryMap.put("query", select + from);
            }
            //from = from+"ORDER BY "+orderbyColumn+" "+sort+" ";
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                closeConnection(connection, null, null);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    } else {
        System.out.println("Connection not Established. Please Contact Vendor");
    }
    return queryMap;// return the map/ list which  contains query and sory and display order
}    

STEP 3 : 結果クエリ
{query= SELECT purchase_order.po_number,purchase_order.placed_date,purchase_order.date_closed,purchase_order.scheduled_arrival_date,purchase_order_inventory.unit_cost,purchase_order_inventory.order_quantity,purchase_order_inventory.roll_number,purchase_order_inventory.rec_vendor_quantity,products.product_sku,products.et_conversion_unit_quantity,product_categories.product_category_name ,product_vendors.vendor_name FROM purchase_order purchase_order,purchase_order_inventory purchase_order_inventory,products products,product_categories product_categories,product_vendors product_vendors}

しかし、これは私が望んでいたものではありません。私が与えたクエリを作成するのを手伝ってください。

4

2 に答える 2

2

2 つのクエリ

次の 2 つのクエリを作成する必要があります。

  1. 有効になっているフィールドを照会する
  2. 2 番目のクエリ文字列を作成します (動的に作成するもの)。

これは、SQL クエリが、データをクエリする前にどの列が含まれるかを伝える必要があるためです。実際、これは内部 DB クエリ プランを構築するために使用されます。これは、要求されたデータを取得して整理するために DB モーターが使用する方法です。

すべての列をクエリ

そのフィールドだけを照会する必要がありますか? すべてを照会して関連データを使用することはできませんか?

ジョイン

更新された質問を見ると、テーブルを正しく結合するために where 条件を動的に追加する必要があると思います。私がしなければならないことは、テーブルが存在するときにどのような条件を追加するかを教えてくれる参照を用意することです。

少なくとも 2 つのオプションがあります。

  1. 存在するテーブルのペアに基づく (例: 「A と B が存在する場合は、A.col1 = B.col2 を追加する」)
  2. 存在するテーブルに基づいて (「B が存在する場合は、A.col1 = B.col2 を追加します。A が存在する必要があります」

あなたの例に基づいて、2番目のオプションがより適していると思います(そして実装が簡単です)。

Map<String, JoinInfo>したがって、JoinInfo が少なくとも持っている静的な場所が必要です。

JoinInfo
+ conditionToAdd // by example "A.col1 = B.col2"
+ dependsOnTable // by example "A" to indicate that A must be present when B is present

したがって、次を使用できます。

  1. 必要なテーブルを追加するためのその情報 (例: A に列が選択されていなくても、B と結合するには存在する必要があります)
  2. where 句に conditionToAdd を含める

とにかく...大変なことになっていると思います。なぜそんなにダイナミックなのですか?

于 2012-09-12T07:28:31.937 に答える
2

一歩一歩物事に近づかなければなりません。

まず、すべての行を返すクエリを作成する必要があります。status='Y'

次に、COLUMN_NAME を文字列のリストに入れます。

List<String> list = new List<String>();
while(rs.next()){
  list.add(rs.getString(columnNumber));
}

そして、List2番目のSQLステートメントをループして動的に生成する必要があります

String sqlSelect = "SELECT ";
String sqlFrom = " FROM SOME_OTHER_TABLE "
String sqlWhere = " WHERE SOME_CONDITION = 'SOME_VALUE' "

for(String x : list){
  sqlFrom += x +" , "+;
}
//here make sure that you remove the last comma from sqlFrom  because you will get an SQLException


String finalSql = sqlSelect + sqlFrom + sqlWhere ;
于 2012-09-12T07:38:00.293 に答える