在这个数据库中,我想选择两个用户,321和102,其中BOOK_TYPE为1或2,并比较他们的BOOK_NR,如果它们重合,则仅从USER_ID 102保存BOOK_COUNT。
SqlCommand command = new SqlCommand("SELECT BOOK_NR, BOOK_COUNT, USER_ID, BOOK_TYPE " +
"FROM BOOKS " +
"WHERE (BOOK_TYPE = '1' OR" + "BOOK_TYPE = '2')" +
"AND MONTH(DATE) = '" + DateTime.Today.Month + "'" +
"GROUP BY BOOK_NR, BOOK_COUNT, USER_ID, BOOK_TYPE ", BookConn);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
string BookNr = (string)reader[0];
int Count = (int)reader[1];
int User = (int)reader[2];
int Type = (int)reader[3];
if( " HERE I NEED HELP " )
{
" AND HERE :) "
}
}
reader.Close();BookConn.Close();
我唯一的解决方案如下
List<string> User321List = new List<string>();
List<string> User102List = new List<string>();
if(User == 321 && Type == 1){ User321List.Add(BookNr.Trim());}
if(User == 102 && Type == 2){ User102List.Add(BookNr.Trim()+"\t"+Count);}
然后......
int count = 0;
foreach (string x in User321List)
{
foreach (string y in User102List)
{
List<string> part = y.Split('\t').Select(p => p.Trim()).ToList();
var z = string.Compare(part[0], x);
if (z == 0)
{
count += int.Parse(part[1]);
}
}
}
但是需要花很多时间才能得到结果。 如果有人从我的噩梦中找到了什么,请帮助并抱歉我的英语不好......
答案 0 :(得分:0)
如果您的查询速度很慢,请考虑将操作分成两部分。创建一个SQL表函数,这样就不会重复SQL,将用户,类型和月份作为参数传递。
不执行IN(如评论中所示)。请记住,WHERE子句中的OR将导致没有使用索引。
加入表函数的两个实例,让sql为你做匹配。 e.g。
Select * from dbo.UserList('321',1,12) as u321
inner join dbo.UserList('102',2,12) as u102
on u321.field = u102.field
BTW ......我介绍了很多高级主题,但我们的想法是让SQL做它最擅长的事情:JOINS
感兴趣的是,如果你的sql表函数返回很多行,并且你曾经在sp中使用它们,记得使用选项(重新编译)子句......
答案 1 :(得分:0)
我将专注于回答第一部分:
我想选择两个用户,321和102,其中BOOK_TYPE为1或2并比较他们的BOOK_NR,如果它们重合,则仅从USER_ID 102保存BOOK_COUNT。
您希望将表格加入自身:
SELECT b1.BOOK_NR, b1.BOOK_COUNT, b1.USER_ID, b1.BOOK_TYPE
FROM BOOKS b1
INNER JOIN BOOKS b2 ON b2.BOOK_TYPE IN ('1','2')
AND b2.User_ID = 321
AND b1.BOOK_NR = b2.BOOK_NR
WHERE b1.User_ID = 102 AND b1.BOOK_TYPE IN ('1','2')
AND MONTH(b1.DATE) = MONTH(current_timestamp)
AND MONTH(b2.DATE) = MONTH(current_timestamp)
由于您的一个问题是性能 - 查询太慢 - 我还需要询问BOOK_TYPE
列是字符串还是数字。如果它是数字列,则应省略值的单引号:例如,只使用IN (1,2)
而不是IN ('1','2')
。这将通过避免潜在的每行转换以及可能更好地匹配索引来帮助提高性能。