0

読みたいテーブルが4つあるとしましょう。

お客様

customer_id,    customer_name
1               Joe Bolggs

customer_orders

customer_id, order_no
----------------------------
1       1
1       2
1       3

customer_addresses

customer_id address
----------------------------
1       11 waterfall road
1       23 The broadway

customer_tel_no

customer_id number
----------------------------
1       523423423432
1       234342342343

上記の顧客情報(id = 1の顧客の場合)は、以下に示すようにJavaオブジェクトに格納されます。

public class Customer{

    String customer_id;
    String customerName;
    ArrayList<String> customerOrders;
    ArrayList<String> customerAddress;
    ArrayList<String> customerTelephoneNumbers;
} 

上記の情報を取得するために私が考えることができる唯一の方法は、3つのクエリを使用することです。その理由は、customerテーブルと他の各テーブルの間に1:*の関係があるためです。データを取得するために、私は次のようなことをしています。

Customer customer = new Customer()

String customerSQL = "Select * from customer where customer_id = ?";
statement = getConnection().prepareStatement(contactsQuery);
statement.setString(1,1);
resultSet = statement.executeQuery(); 

while (resultSet.next()){
    customer.customer_id = resultSet.get(1);    //No getters/setters in this example
    customer.customerName = resultSet.get(2);
}

String customerOrdersSQL = "Select * from customer_orders where customer_id = ?";
statement = getConnection().prepareStatement(customerOrdersSQL); 
statement.setString(1,1);
resultSet = statement.executeQuery(); 

customer.customerOrders = new ArrayList();
while (resultSet.next()){
    customer.customerOrders.add(resultSet.getString(2);  // all the order numbers
}


String customerAddressesSQL = "Select * from customer_addresses where customer_id = ?";
statement = getConnection().prepareStatement(customerAddressesSQL ); 
statement.setString(1,1);
resultSet = statement.executeQuery(); 

customer.customerAddresses = new ArrayList();
while (resultSet.next()){
    customer.customerAddresses.add(resultSet.getString(2);  // all the addresses
}


String customerTelSQL = "Select * from customer_tel_no where customer_id = ?";
statement = getConnection().prepareStatement(customerTelSQL); 
statement.setString(1,1);
resultSet = statement.executeQuery(); 

customer.customerTelephoneNumbers = new ArrayList();
while (resultSet.next()){
    customer.customerTelephoneNumbers.add(resultSet.getString(2);  // all the order numbers
}

上記の問題は、データベースに対して3回の呼び出しを行っていることです。上記を単一のクエリにマージする方法はありますか?

たとえば、customerとcustomer_ordersの間の結合は、customer_ordersの各行の顧客行を返すため、結合がどのように機能するかわかりません。とにかく、上記の3つのクエリを1つにマージできますか?

4

3 に答える 3

1

私はこのようなものがうまくいくと思います:

SELECT c.customer_id, c.customer_name, o.order_no, a.address, t.number
FROM customer c LEFT JOIN customer_orders o ON c.customer_id = o.customer_id
LEFT JOIN customer_addresses a ON c.customer_id = a.customer_id
LEFT JOIN customer_tel_no t ON c.customer_id = t.customer_id
WHERE c.customer_id = ?

次に、コードで、クエリを実行した後、次のようにします。

while (resultSet.next())
{
    customer.customerOrders.add(resultSet.getString(3));
    customer.customerAddresses.add(resultSet.getString(4));
    customer.customerTelephoneNumbers.add(resultSet.getString(5));
}

もちろん、これは途中でnull値が発生するという事実を考慮していないため、配列リストに大量のジャンクを追加していないことを確認するためにnullをチェックすることをお勧めします。それでも、それはおそらく3つの別々のクエリよりもはるかに安価です。

于 2012-11-30T20:19:46.433 に答える
1

結合された結果を繰り返して顧客オブジェクトに処理することを妨げるものは何もありません。アプリケーションが十分に複雑な場合は、内部でそれを行うORMフレームワークを調べることができます。JavaEEを使用している場合は、JPAを参照してください。

于 2012-11-30T20:23:56.410 に答える
0

このクエリを使用して、呼び出しの数を減らします。そして、データのwhileループプロセスで。

customer.customer_id、customer.customer_name、order_no、address、numberを選択します

顧客から、customer_orders、customer_addresses、customer_tel_no

ここで、customer.customer_id = customer_orders.customer_id AND customer.customer_id = customer_addresses.customer_id AND customer.customer_id = customer_tel_no.customer_id

于 2012-12-28T14:28:44.437 に答える