2012-01-02 143 views
0

我必須運行1個查詢,然後用第一個結果運行另一個查詢。我意識到我可能只是拋出數組中的第一個結果集,然後遍歷數組,但有沒有一種方法來嵌套查詢,以便我不必亂搞數組?在asp.net中嵌套的SQL查詢

這裏是我當前的代碼:

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 ([email protected]_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 ([email protected]_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 ([email protected]_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(); 
     } 
    } 

兩個查詢的輸出用於創建多行數據的表。每行都是數據庫中的一個項目,出價者的信息最高,包括出價本身以及一些類別信息。類別信息是第一個查詢,而唯一項目信息是第二個查詢(在這裏您可以看到使用兩個結果集構建的表格行)。

編輯

我改變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 ([email protected]_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 ([email protected]_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中進行嵌套查詢。

+0

正在使用的是何種數據庫? – 2012-01-02 16:30:47

+0

SQL。如果你想要的東西,我不知道。抱歉。我將如何發現? – James 2012-01-02 16:37:04

+0

看到一些樣本預期輸出真的很有用。 MS-SQL(2005/2008等),MySQL,Oracle,DB2,PostGres, – xQbert 2012-01-02 16:41:03

回答

2

嘗試:

select * from 
(SELECT i.item_id, 
     i.item_lot, 
     i.item_title, 
     i.item_est_lo, 
     i.item_est_hi, 
     i.item_timed_start, 
     i.item_reserve, 
     h.bid_price, 
     l.mail_Email1, 
     h.bid_bidder_id, 
     l.mail_FirstName, 
     l.mail_LastName, 
     h.bid_item_id, 
     row_number() over (partition by i.item_id 
          order by h.bid_price DESC, h.bid_date DESC) rn 
FROM tblItem i 
INNER JOIN tblBidHistory h 
     on i.item_id = h.bid_item_id=i.item_id AND h.bid_type = '2' 
INNER JOIN tblBidder b 
     ON h.bid_bidder_id = b.bidder_number AND b.bidder_sale_id=i.item_sale_id 
INNER JOIN tblMailList l 
     ON b.bidder_mail_id = l.mail_ID 
WHERE [email protected]_sale_id) v 
where rn=1 
+0

我試着將row_number()函數(直到幷包括rn的整行)添加到我的select語句的末尾,然後將其全部包含在另一個select語句中,其中rn = 1並且接收到錯誤> ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中是無效的,除非還指定了TOP或FOR XML。 我把我的order by子句外移到第一個select語句中,並按v.column命令,然後開始收到錯誤,說tblItem。item_id(和其他)不在group by或aggregate函數中,因此無法選擇。 – James 2012-01-02 18:32:36

+0

@詹姆斯,你有沒有在這個答案中試過查詢? – 2012-01-02 19:29:21

+0

當我使用整個查詢時,出現錯誤'附近的語法不正確'('.' – James 2012-01-02 19:42:01

1

我很懷疑下面是正確的:太多的假設和缺乏問題的認識:但是這是一個方式加入他們 假設項目加入由I.Item_lot並通過Bid_Item_ID 新增爲BH添加的項目數據 添加項目數據以選擇和分組。

SELECT TOP (1) 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 ([email protected]_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 ([email protected]_sale_id) 
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 
HAVING ([email protected]_id) AND (BH.bid_type = '2') 
ORDER BY I.Item_Lot, BH.bid_price DESC, BH.bid_date DESC 
+0

我認爲OP希望出售中每件商品的最高出價,而不是出售中任何商品的最高最高出價。 – 2012-01-02 17:35:24

+0

@MarkBannister是的,沒錯。我試圖在相同的銷售中獲得每個單獨的項目。 – James 2012-01-02 17:37:32

+0

並且在稍微的tweeks之後,我得到了所有的數據,但是在某些情況下我得到了多行相同的數據。 – James 2012-01-02 17:38:53