我正在使用sql-server 2005和ASP.NET与C#。
我有
的用户表userId(int),
userGender(tinyint),
userAge(tinyint),
userCity(tinyint)
(课程的简化版)
我需要选择总是两个适合我转到的用户ID我会查询异性的用户,年龄范围为-5到+ 10年且来自同一个城市。
重要的事实是它总是必须是两个,所以我创建了条件,如果@@ rowcount< 2重新选择没有年龄和城市过滤器。
现在问题是我有时会有两个返回的结果集,因为我在表上使用了第一个@@ rowcount。如果我运行查询。
使用DataReader
对象从总是第二个结果集读取是否会有问题?有没有其他方法可以检查选择了多少结果而没有对结果进行选择?
答案 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,可能会有方言问题。