所以我有这个:
const string sqlString =
"SELECT * FROM Causes c INNER JOIN CauseMembers m ON " +
"(c.Id = m.CauseId) AND (UserName = @UserName) " +
"ORDER BY c.DateTime DESC;";
工作正常,但是我想从表causemembers返回一个生成的列,其中包含从此查询返回的行数。这样我就可以得到加入这个'因果'的实际成员(来自原因)。
您的意见?感谢
答案 0 :(得分:1)
由于您已经返回所有列(*)并且已标记C#,因此看起来您正在将结果加载到DTO(或ADO.NET对象)中。
为什么不直接计算结果对象中的行/项数?
答案 1 :(得分:1)
如果您使用的是SQL Server 2005或更高版本,则可以使用窗口函数:
SELECT <ALL COLUMNS YOU'RE INTERESTED IN>, COUNT(m.CauseId) OVER (PARTITION BY c.ID)
FROM Causes c JOIN CauseMembers m ON (c.Id = m.CauseId) AND (UserName = @UserName)
ORDER BY c.DateTime DESC
这将为您计算每个原因ID返回的行数。如果您想确保返回每个原因,无论是否有任何成员,请将JOIN
更改为LEFT OUTER JOIN
。如果没有CauseMembers,那么外部联接中的NULL
将不会被计算,因此您将获得零。
答案 2 :(得分:0)
这将获得计数,但不会获得其他字段。另一种方法是使用
使用嵌入式select语句const string sqlString =
"SELECT c.ID, COUNT(m.causeID) FROM Causes c RIGHT OUTER JOIN CauseMembers m ON " +
"(c.Id = m.CauseId) AND (UserName = @UserName) " +
"GROUP by c.ID ;";