2010-07-13 178 views
1

我在C#中使用sql-server 2005和ASP.NET。幫助SQL語句

我有用戶表

userId(int), 
userGender(tinyint), 
userAge(tinyint), 
userCity(tinyint) 

(當然簡化版)

,我需要選擇總有兩個適合用戶ID我通過查詢異性的用戶,年齡-5到+10年的範圍和來自同一城市。

重要的事實是它總是必須有兩個,所以我創造了條件,如果@@ ROWCOUNT < 2重新選擇沒有年齡和城市過濾器。

現在的問題是,我有時有兩個返回的結果集,因爲我用的第一個@@ ROWCOUNT在桌子上。如果我運行查詢。

會不會是使用DataReader對象總是從第二個結果集讀出了問題?有沒有其他方法可以檢查選擇了多少結果而不用結果進行選擇?

回答

4

你能使用SELECT TOP 2簡化呢?

更新:我會執行這兩個選擇的時候,工會的結果,然後根據(使用SELECT TOP 2)作爲工會可能已經添加兩個以上的訂單從他們選擇。重要的是,這個下一個選擇按照重要性順序選擇行,即它優先選擇第一個選擇的行。

另外,有讀者邏輯讀取下如果有一個獨自離開SQL結果集。

+0

我可以和這是我做的。當選擇top 2返回少於兩條記錄時會發生什麼?我需要總是選擇頂部2,只要3個過濾器不給我兩個記錄我選擇使用一個過濾器。 – eugeneK 2010-07-13 08:29:08

3

爲了避免獲得兩個單獨的結果集,您可以將第一個SELECT放入表變量中,然後執行@@ROWCOUNT檢查。如果> = 2,則只需從表變量中自行選擇,否則使用第二個查詢的結果選擇表變量UNION ALL的結果。

編輯:使用表變量有一個小小的開銷,所以您需要權衡這是否比Adam的建議便宜,只是通過查看執行統計信息來執行'UNION'這兩種方法

SET STATISTICS IO ON 
+0

+1好點。我的方法更多地是以降低代碼複雜度爲代價來提高性能。 – 2010-07-13 08:42:35

+0

和@Adam我會嘗試您的兩種創意方法,並查看我的表格更快速地工作。 謝謝。對不起,不能選擇兩個答案,因此會選擇性能最好的答案。 – eugeneK 2010-07-13 08:57:01

3

將事情大致如下是有用的......

SELECT * 
    FROM (SELECT 1 AS prio, * 
      FROM my_table M1 JOIN my_table M2 
      WHERE M1.userID = supplied_user_id AND 
        M1.userGender <> M2.userGender AND 
        M1.userAge - 5 >= M2.userAge AND 
        M1.userAge + 15 <= M2.userAge AND 
        M1.userCity  = M2.userCity 
      LIMIT TO 2 ROWS 
      UNION 
      SELECT 2 AS prio, * 
       FROM my_table M1 JOIN my_table M2 
       WHERE M1.userID = supplied_user_id AND 
        M1.userGender <> M2.userGender 
       LIMIT TO 2 ROWS) 
    ORDER BY prio 
    LIMIT TO 2 ROWS; 

我還沒有嘗試過,因爲我沒有SQL Server和可能存在的問題方言。

+0

在SQL Server中,您將使用'SELECT TOP 2'而不是'LIMIT'語句,'UNION ALL'比'UNION'便宜,但這會起作用。 – 2010-07-13 08:43:56

+0

右鍵。謝謝史密斯先生。我想也許UNION DISTINCT會更好。 – 2010-07-13 08:59:36

+0

謝謝。這或多或少是Adam用榜樣所說的。 – eugeneK 2010-07-13 09:09:44