摆脱GridView中的重复数据

时间:2013-08-08 20:10:46

标签: c# asp.net sql sql-server grid

我在GridView内获取重复数据,同时从SQL Server中提取信息。我正在使用存储过程并使用一些C#来设置参数,然后使用SqlDataSource将存储过程中的sql数据放入GridView。我和其他人一样看过其他一些问题,但SQL脚本与我的不同。我也知道我的C#代码工作正常,但我也会发布,

以下是代码:

SQL:

SELECT 
    people.name, comage.age, grad.date
FROM 
    people
INNER JOIN 
    (SELECT age, MAX(term)[term] 
     FROM comage GROUP BY date) comage ON people.term = comage.term
INNER JOIN 
    (SELECT date, MAX(term)[term] 
     FROM grad GROUP BY date) grad ON people.term = grad.term
WHERE 
    people.ID = @ID
ORDER BY 
    LastName

ASP.net:

    <asp:GridView ID="grid" runat="server"></GridView>

C#代码:

    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "prcedureName";
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    SqlParameter param = null;
    param = cmd.Parameters.Add("@ID",System.Data.SqlDataType.NChar,255);
    param.Direction = System.Data.ParameterDirection.Input;
    param.value = in; //in is a string of some value
    cmd.Connection = con; //con is a SqlConnection of some sort
    SqlDataAdapter adp = new SqlDataAdapter(cmd);
    SqlCommandBuilder command = new SqlCommandBuilder(adp);
    DataTable data = new DataTable();
    data.Locale = System.Globalization.CultureInfo.InvariantCulture;
    adp.Fill(data);
    grid.DataSource = data;
    grid.AutoGenerateColumns = true;
    grid.DataBind();

以下是表格:

表:

    --------------------
    |name  | ID | term |
    --------------------
    |jeff  | 0  |   A  |
    |Jake  | 1  |   B  |
    --------------------

comage 表:

    --------------------
    |Age  |   Term     |
    --------------------
    |23   |    A       |
    |25   |    B       |
    --------------------

毕业表:

    --------------------
    | Date |    Term   |
    --------------------
    | DEC  |     A     |
    | SUM  |     B     |
    --------------------

2 个答案:

答案 0 :(得分:2)

您确定在SQL中没有向后聚合吗?我原以为它的编写更像这样:

SELECT people.name, Max(comage.age) age, Max(grad.date) date
FROM   people
INNER JOIN comage ON people.term = comage.term
INNER JOIN grad ON people.term = grad.term
WHERE people.ID = @ID
GROUP BY people.name
ORDER BY LastName

哪会产生这样的结果集:

name | age | date
------------------
Jeff |  23 | DEC
Jake |  25 | SUM

答案 1 :(得分:0)

根据我提交的ID,我只能获得一条记录。

DECLARE @People TABLE ([Name] VARCHAR(10), ID INT, Term VARCHAR(10));
DECLARE @Comage TABLE (Age INT, Term VARCHAR(10));
DECLARE @Grad TABLE ([Date] VARCHAR(10), Term VARCHAR(10));
DECLARE @ID INT;

SET @ID = 0;

INSERT INTO @People VALUES ('Jeff', 0, 'A');
INSERT INTO @People VALUES ('Jake', 1, 'B');

INSERT INTO @Comage VALUES (23, 'A');
INSERT INTO @Comage VALUES (25, 'B');

INSERT INTO @Grad VALUES ('DEC', 'A');
INSERT INTO @Grad VALUES ('SUM', 'B');

SELECT age, MAX(term) [term]
INTO #Comage
FROM @Comage 
GROUP BY [Age]

SELECT [Date], MAX(term) [term] 
INTO #Grad
FROM @Grad GROUP BY [Date]

SELECT 
    p.name, c.age, g.[Date]
FROM 
    @People p
INNER JOIN #Comage c
    ON c.term = p.term
INNER JOIN #Grad g
    ON g.term = p.term
WHERE 
    p.ID = @ID

DROP TABLE #Comage
DROP TABLE #Grad