2010-07-13 141 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