SqlClient数据过滤

时间:2014-10-29 15:38:56

标签: c# sql-server sqlclient

在这个数据库中,我想选择两个用户,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();

DATABASE

  

我唯一的解决方案如下

        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]);
                }
            }
        }

但是需要花很多时间才能得到结果。 如果有人从我的噩梦中找到了什么,请帮助并抱歉我的英语不好......

2 个答案:

答案 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')。这将通过避免潜在的每行转换以及可能更好地匹配索引来帮助提高性能。