协助SQL语句

时间:2010-07-13 08:24:05

标签: sql sql-server

我正在使用sql-server 2005和ASP.NET与C#。

我有

的用户表
userId(int),
userGender(tinyint),
userAge(tinyint),
userCity(tinyint)

(课程的简化版)

我需要选择总是两个适合我转到的用户ID我会查询异性的用户,年龄范围为-5到+ 10年且来自同一个城市。

重要的事实是它总是必须是两个,所以我创建了条件,如果@@ rowcount< 2重新选择没有年龄和城市过滤器。

现在问题是我有时会有两个返回的结果集,因为我在表上使用了第一个@@ rowcount。如果我运行查询。

使用DataReader对象从总是第二个结果集读取是否会有问题?有没有其他方法可以检查选择了多少结果而没有对结果进行选择?

3 个答案:

答案 0 :(得分:4)

您可以使用SELECT TOP 2来简化它吗?

更新:我会同时执行选择,联合结果,然后根据订单(使用SELECT TOP 2)从中选择,因为联合可能已添加超过二。重要的是,下一个选择按重要性顺序选择行,即它更喜欢第一次选择的行。

或者,让读者逻辑读取下一个结果集(如果有的话)并单独保留SQL。

答案 1 :(得分:3)

为避免获得两个单独的结果集,您可以将第一个SELECT放入表变量中,然后进行@@ROWCOUNT检查。如果> = 2,则只需从表变量中自行选择,否则使用第二个查询的结果选择表变量UNION ALL的结果。

编辑:使用表变量会有轻微的开销,所以你需要平衡这是否比亚当的建议更便宜,只是为了通过查看来执行'UNION'的例行程序两种方法的执行统计数据

SET STATISTICS IO ON

答案 2 :(得分: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,可能会有方言问题。