Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET C Sql在不重复[ASP.NET清理]的情况下加入时间范围_C#_Asp.net_Sql_Sql Server - Fatal编程技术网

C# ASP.NET C Sql在不重复[ASP.NET清理]的情况下加入时间范围

C# ASP.NET C Sql在不重复[ASP.NET清理]的情况下加入时间范围,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,我有下面两张桌子 工商管理硕士 地图 我需要以下输出 我使用下面的代码 并删除重复id行。然后使用下面的查询显示不重复的数据,并再次显示到datatable。它返回时在datatable中没有重复的mapid,但带有MBAID Dulicates using (SqlConnection sCon = new SqlConnection(connec)) { foreach (int id in duplicateID) {

我有下面两张桌子

工商管理硕士

地图

我需要以下输出

我使用下面的代码

并删除重复id行。然后使用下面的查询显示不重复的数据,并再次显示到datatable。它返回时在datatable中没有重复的mapid,但带有MBAID Dulicates

using (SqlConnection sCon = new SqlConnection(connec))
        {

            foreach (int id in duplicateID)
            {

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow ddr = dt.Rows[i];
                    if (ddr["mapID"].ToString() == id.ToString())
                        ddr.Delete();
                }


                sCon.Open();
                {
                    SqlCommand cmd = new SqlCommand(@"select Distinct top 1 mp.Id as mapid, mb.Id as mbaid, mp.Channel, mp.Product, mp.ProgDate, mp.AdvTime, mb.Channel,  mb.ProgStartTime,mb.ProgEndTime,mb.progdate, convert(time, dateadd(minute, datediff(minute, mb.progStartTime, mb.progEndTime), 0)) as timeDiff 
from MBA22 as mb
  inner join Map22 as mp on(mp.Channel=mb.Channel and mp.Product=mb.Product and mb.ProgDate=mp.ProgDate )
    where(
    (mb.ProgStartTime < mb.ProgEndTime
      and mb.ProgStartTime <=
        case when datediff(mi, mb.ProgStartTime, mb.ProgEndTime) <= 60
          then dateadd(mi, 5, mp.AdvTime)
          else mp.AdvTime
          end
      and mb.ProgEndTime >=
        case when datediff(mi, mb.ProgStartTime, mb.ProgEndTime) <= 60
          then dateadd(mi, -5, mp.AdvTime)
          else mp.AdvTime
          end) or
    (mb.ProgStartTime > mb.ProgEndTime
      and (mb.ProgStartTime <=
        case when 1440 - datediff(mi, mb.ProgEndTime, mb.ProgStartTime) <= 60
          then dateadd(mi, 5, mp.AdvTime)
          else mp.AdvTime
          end
      or mb.ProgEndTime >=
        case when 1440 - datediff(mi, mb.ProgEndTime, mb.ProgStartTime) <= 60
          then dateadd(mi, -5, mp.AdvTime)
          else mp.AdvTime
          end)))
and mp.Id = '" + id + "'  order by  timeDiff asc", sCon);
                    cmd.CommandTimeout = 0;
                    SqlDataReader dr = cmd.ExecuteReader();

请帮助PPP

尝试此查询相应地工作,但有风险,因为根据您的需要,1条记录映射到另一个表,因此应正确维护序列,否则您将获得错误的记录

select 
    t2.mapId, 
    t1.Channel, 
    t1.Product, 
    t1.ProgDate, 
    t2.AdvTime,
    t1.ProgStartTime, 
    t1.ProgEndTime, 
    t1.mbaid
FROM 
    (select 
         ROW_NUMBER() OVER(order by mbaid) as rId, * 
    from 
         mba
    ) t1, 
    (select 
         ROW_NUMBER() OVER(order by mapid) as rId, * 
    from 
         map
    ) t2
WHERE 
    t1.rId = t2.rId;a

您必须在映射表中添加MBAId或在MBA表中添加MAPId。并使用它加入。@RaviSingh但我在表中没有任何外键关系OK设置问题的方式有点混乱。据我所知,你需要一张mba的地图,而不是重复广告时间/地图,对吗?@TonyShih。为一个StartTime EndTime映射的AdvTime不应重复[如我预期的输出所示]。谢谢您的时间,但我不希望按照行号进行连接。行号可以更改。如果您想拥有不重复的advTime,则最好在您使用的代码中使用。那么您原来的查询就可以了。使用sql可能会有一些方法来实现您所需的输出,但不会那么有效。
+-----------+-------+-------+-------------+---------+--------------+-----------+-----+
| mapId     |Channel|Product| ProgDate    | AdvTime |ProgStartTime |ProgEndTime|mbaid| 
+-----------+-------+-------+-------------+---------+--------------+-----------+-----+
|  8        | AA    | SS    | 01/04/2011  | 19:35:14|16:00:00      | 20:00:00  |  12 |  
|  9        | AA    | SS    | 01/04/2011  | 18:40:19|16:00:00      | 20:00:00  |  13 | 
|  10       | AA    | SS    | 01/04/2011  | 19:36:58|16:00:00      | 20:00:00  |  14 | 
|  11       | AA    | SS    | 01/04/2011  | 17:47:13|16:00:00      | 17:00:00  |  15 | 
+-----------+-------+-------+-------------+---------+--------------+-----------+-----+
select *
from MBA2 as mba
  inner join Map2 as map on(map.Channel=mba.Channel and map.Product=mba.Product)
    where(
    (MBA.ProgStartTime < MBA.ProgEndTime
      and MBA.ProgStartTime <=
        case when datediff(mi, MBA.ProgStartTime, MBA.ProgEndTime) <= 60
          then dateadd(mi, 5, Map.AdvTime)
          else Map.AdvTime
          end
      and MBA.ProgEndTime >=
        case when datediff(mi, MBA.ProgStartTime, MBA.ProgEndTime) <= 60
          then dateadd(mi, -5, Map.AdvTime)
          else Map.AdvTime
          end) or
    (MBA.ProgStartTime > MBA.ProgEndTime
      and (MBA.ProgStartTime <=
        case when 1440 - datediff(mi, MBA.ProgEndTime, MBA.ProgStartTime) <= 60
          then dateadd(mi, 5, Map.AdvTime)
          else Map.AdvTime
          end
      or MBA.ProgEndTime >=
        case when 1440 - datediff(mi, MBA.ProgEndTime, MBA.ProgStartTime) <= 60
          then dateadd(mi, -5, Map.AdvTime)
          else Map.AdvTime
          end)))
order by advtime asc
if (repeatID.Contains(int.Parse(dr["mapID"].ToString())))
        {
            duplicateID.Add(int.Parse(dr["mapID"].ToString()));


        }

        else
        {
            DataRow dr1 = dt.NewRow();
            dr1[0] = int.Parse(dr["mapID"].ToString());

            dr1[10] = int.Parse(dr["mbaID"].ToString());

            dr1[1] = (dr["Channel"].ToString());


            dr1[2] = (dr["Product"].ToString());


            dr1[3] = (dr["ProgDate"].ToString());


            dr1[4] = (dr["AdvTime"].ToString());


            dr1[5] = (dr["Progstarttime"].ToString());


            dr1[6] = (dr["Progendtime"].ToString());


            dr1[7] = (dr["Channel"].ToString());

            dr1[8] = (dr["Product"].ToString());

            dr1[9] = (dr["ProgDate"].ToString());




            dt.Rows.Add(dr1);

        }

        repeatID.Add(int.Parse(dr["mapID"].ToString()));

       i = i + 1;
    }
    sCon.Close();
}
using (SqlConnection sCon = new SqlConnection(connec))
        {

            foreach (int id in duplicateID)
            {

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow ddr = dt.Rows[i];
                    if (ddr["mapID"].ToString() == id.ToString())
                        ddr.Delete();
                }


                sCon.Open();
                {
                    SqlCommand cmd = new SqlCommand(@"select Distinct top 1 mp.Id as mapid, mb.Id as mbaid, mp.Channel, mp.Product, mp.ProgDate, mp.AdvTime, mb.Channel,  mb.ProgStartTime,mb.ProgEndTime,mb.progdate, convert(time, dateadd(minute, datediff(minute, mb.progStartTime, mb.progEndTime), 0)) as timeDiff 
from MBA22 as mb
  inner join Map22 as mp on(mp.Channel=mb.Channel and mp.Product=mb.Product and mb.ProgDate=mp.ProgDate )
    where(
    (mb.ProgStartTime < mb.ProgEndTime
      and mb.ProgStartTime <=
        case when datediff(mi, mb.ProgStartTime, mb.ProgEndTime) <= 60
          then dateadd(mi, 5, mp.AdvTime)
          else mp.AdvTime
          end
      and mb.ProgEndTime >=
        case when datediff(mi, mb.ProgStartTime, mb.ProgEndTime) <= 60
          then dateadd(mi, -5, mp.AdvTime)
          else mp.AdvTime
          end) or
    (mb.ProgStartTime > mb.ProgEndTime
      and (mb.ProgStartTime <=
        case when 1440 - datediff(mi, mb.ProgEndTime, mb.ProgStartTime) <= 60
          then dateadd(mi, 5, mp.AdvTime)
          else mp.AdvTime
          end
      or mb.ProgEndTime >=
        case when 1440 - datediff(mi, mb.ProgEndTime, mb.ProgStartTime) <= 60
          then dateadd(mi, -5, mp.AdvTime)
          else mp.AdvTime
          end)))
and mp.Id = '" + id + "'  order by  timeDiff asc", sCon);
                    cmd.CommandTimeout = 0;
                    SqlDataReader dr = cmd.ExecuteReader();
select 
    t2.mapId, 
    t1.Channel, 
    t1.Product, 
    t1.ProgDate, 
    t2.AdvTime,
    t1.ProgStartTime, 
    t1.ProgEndTime, 
    t1.mbaid
FROM 
    (select 
         ROW_NUMBER() OVER(order by mbaid) as rId, * 
    from 
         mba
    ) t1, 
    (select 
         ROW_NUMBER() OVER(order by mapid) as rId, * 
    from 
         map
    ) t2
WHERE 
    t1.rId = t2.rId;a