1つのクエリを実行してから、最初のクエリの結果を使用して別のクエリを実行する必要があります。配列内に最初の結果セットをスローしてから配列を反復処理できることに気付きましたが、配列をいじる必要がないようにクエリをネストする方法はありますか?
これが私の現在のコードです:
SqlConnection conn2 = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["wesdb1SQL"].ToString());
SqlCommand strSQL2;
SqlDataReader itemReader2;
using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["wesdb1SQL"].ToString()))
using (SqlCommand strSQL = conn.CreateCommand())
{
strSQL.CommandText = "SELECT item_id,item_lot,item_title,item_est_lo,item_est_hi,item_timed_start,item_reserve FROM tblItem WHERE (item_sale_id=@item_sale_id) ORDER BY item_lot";
strSQL.Parameters.Add(new SqlParameter("@item_sale_id", SqlDbType.VarChar, 10, ParameterDirection.Input, true, 0, 0, "item_sale_id", DataRowVersion.Current, itemSaleId1_Var));
try
{
conn.Open();
using (SqlDataReader itemReader = strSQL.ExecuteReader())
{
if (itemReader.Read())
{
using (conn2)
using (strSQL2 = conn2.CreateCommand())
{
strSQL2.CommandText = "SELECT TOP (1) MAX(tblBidHistory.bid_price) AS bid_price, tblMailList.mail_Email1, tblBidHistory.bid_bidder_id, tblMailList.mail_FirstName, tblMailList.mail_LastName, tblBidHistory.bid_item_id FROM tblBidHistory INNER JOIN tblBidder ON tblBidHistory.bid_bidder_id = tblBidder.bidder_number AND (tblBidder.bidder_sale_id=@item_sale_id) INNER JOIN tblMailList ON tblBidder.bidder_mail_id = tblMailList.mail_ID GROUP BY tblMailList.mail_Email1, tblBidHistory.bid_bidder_id, tblMailList.mail_FirstName, tblMailList.mail_LastName, tblBidHistory.bid_item_id,tblBidHistory.bid_type,tblBidHistory.bid_date HAVING (tblBidHistory.bid_item_id=@item_id) AND (tblBidHistory.bid_type = '2') ORDER BY bid_price DESC,bid_date DESC";
strSQL2.Parameters.Add(new SqlParameter("@item_sale_id", SqlDbType.VarChar, 10, ParameterDirection.Input, true, 0, 0, "item_sale_id", DataRowVersion.Current, itemSaleId1_Var));
strSQL2.Parameters.Add(new SqlParameter("@item_id", SqlDbType.VarChar, 10, ParameterDirection.Input, true, 0, 0, "item_id", DataRowVersion.Current, itemReader["item_id"].ToString()));
try
{
conn2.Open();
using (itemReader2 = strSQL2.ExecuteReader())
{
if (itemReader2.Read())
{
if (count % 2 == 0)
{
results_Var += "<tr><td colspan=\"2\"><font size=\"2\">" + itemReader["item_lot"].ToString() + " - <u>" + itemReader["item_title"].ToString() + "</u></font></td><td><font size=\"2\">$" + itemReader["item_est_lo"].ToString() + " - $" + itemReader["item_est_hi"].ToString() + "</font></td><td>" + itemReader2["bid_price"].ToString() + " - " + itemReader2["bid_bidder_id"].ToString() + " (" + itemReader2["mail_FirstName"].ToString() + " " + itemReader2["mail_LastName"].ToString() + ")</td><td><font size=\"2\">$" + itemReader2["bid_price"].ToString() + "</font></td></tr>";
}
else
{
results_Var += "<tr><td colspan=\"2\" bgcolor=\"#b0e0e6\"><font size=\"2\">" + itemReader["item_lot"].ToString() + " - <u>" + itemReader["item_title"].ToString() + "</u></font></td><td><font size=\"2\">$" + itemReader["item_est_lo"].ToString() + " - $" + itemReader["item_est_hi"].ToString() + "</font></td><td>" + itemReader2["bid_price"].ToString() + " - " + itemReader2["bid_bidder_id"].ToString() + " (" + itemReader2["mail_FirstName"].ToString() + " " + itemReader2["mail_LastName"].ToString() + ")</td><td><font size=\"2\">$" + itemReader2["bid_price"].ToString() + "</font></td></tr>";
}
}
itemReader2.Close();
}
}
catch (Exception e1)
{
throw new Exception(e1.Message);
}
finally
{
conn2.Close();
}
}
}
itemReader.Close();
}
}
catch (Exception e2)
{
throw new Exception(e2.Message);
}
finally
{
conn.Close();
}
}
両方のクエリの出力は、データの複数の行のテーブルを作成するために使用されます。各行はデータベース内の1つのアイテムであり、入札自体を含む最高入札者の情報と、いくつかのカテゴリ情報が含まれています。カテゴリ情報は最初のクエリであり、一意のアイテム情報は2番目のクエリです(両方の結果セットを使用して作成されているテーブル行を確認できます)。
編集
xQbertクエリを少し変更して、次のようになりました。
SELECT MAX(BH.bid_price) AS bid_price, ML.mail_Email1, BH.bid_bidder_id, ML.mail_FirstName, ML.mail_LastName, BH.bid_item_id, I.item_lot, I.item_title, I.item_est_lo, I.item_est_hi, I.item_timed_start, I.item_reserve
FROM tblBidHistory BH
INNER JOIN tblBidder B ON BH.bid_bidder_id = B.bidder_number AND (B.bidder_sale_id=@item_sale_id)
INNER JOIN tblMailList ML ON B.bidder_mail_id = ML.mail_ID
INNER JOIN tblItem I ON I.Item_ID = BH.Bid_item_id
WHERE (I.item_sale_id=@item_sale_id) And (BH.bid_type = '2')
GROUP BY ML.mail_Email1, BH.bid_bidder_id, ML.mail_FirstName, ML.mail_LastName, BH.bid_item_id, BH.bid_type, BH.bid_date, I.item_lot, I.item_title, I.item_est_lo, I.item_est_hi, I.item_timed_start, I.item_reserve
ORDER BY I.Item_Lot
これによりデータが得られますが、各アイテムの最高入札者ではなく、各アイテムのすべての入札者が得られます。別の方法でグループ化する必要があるのか、サブクエリを使用する必要があるのかわかりません。
また、これを行うために、私は1つのクエリを作成しています。ただし、SQLでネストされたクエリを作成する方法を知りたいです。